美文网首页
如何查看一个 Java 对象的大小

如何查看一个 Java 对象的大小

作者: 余平的余_余平的平 | 来源:发表于2017-08-04 11:47 被阅读0次

最近一直着迷于缓存行,要想正确理解缓存行以及伪共享就一定要知道Java对象的大小,以及如何分布.

在这里演示了使用JOL 工具来查看一个对象的大小和分布.

JOL (Java Object Layout) is the tiny toolbox to analyze object layout schemes in JVMs. These tools are using Unsafe, JVMTI, and Serviceability Agent (SA) heavily to decoder the actual object layout, footprint, and references. This makes JOL much more accurate than other tools relying on heap dumps, specification assumptions, etc.

该工具官网:

http://openjdk.java.NET/projects/code-tools/jol/

下载地址:

http://central.maven.org/maven2/org/openjdk/jol/jol-cli/

下载jar包后保持如下的相对路径 和你要测试的类在一起.

写一个对象来查看:

public final class VolatileLong

{

/**

* 大小计算:

*  long 8 字节

* [1]java对象头: 32位 :8 byte 64位:12 byte

* 所以总共: 6 个填充 * 8 byte + 8 (value) + 8 (对象头) = 64 byte

*  还有采用如下方式的

*  long p1, p2, p3, p4, p5, p6, p7; // cache line padding  -> 7 *8 = 56 字节

*  long value;  ->  8 字节

*  long p8, p9, p10, p11, p12, p13, p14; // cache line padding -> 7*8 = 56 字节

*

*  java.util.concurrent.Exchanger.Slot

*          // Improve likelihood of isolation on <= 64 byte cache lines

*  long q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe;  15 * 8

*  不知道为啥是这样实现:因为父类还有一个Long值 所以总的来说已经超过128了

*

*/

public volatile long value = 0L;

public long p1, p2, p3, p4, p5, p6; // comment out

//objectsize = 6*8 + 8 + 4 =

}

例如 上面的这个类在32 bit jvm上应该是 64 字节,正好攒够一个缓存行大小,

对象头8 字节 + 8 (value long大小) + 6*8 (填充) = 64 字节

在64bit jvm上 开启指针压缩: (默认开启):

对象头12字节 (但是要对齐8字节 所以对象头总共16字节.)

64bit不开启指针压缩:

对象头为完整的16字节.

Java对象分布细节:

header

double /long 8byte

int 4 byte

byte 1 byte

boolean 1byte

Object ref 4 byte

Objetc [] arrat 4

同时 如果头有剩余空间会优先填充.

示例代码:

public class ObjectLoc

{

boolean booleanV, booleanV2;

byte byteV;

int intV;

long longV;

double doubleV;

Object ref;

Object [] arr;

}

有压缩:

没有压缩:

相关文章

  • 如何查看一个 Java 对象的大小

    最近一直着迷于缓存行,要想正确理解缓存行以及伪共享就一定要知道Java对象的大小,以及如何分布. 在这里演示了使用...

  • 查看java 对象的大小

    最近有点忙,上班烦了,所以抽时间去论坛看了看 ,看到一个用来显示对象大小的工具JOL (Java Object L...

  • java反射-Field

    在之前的文章如何查看java对象大小及其地址中我们已经知道对象在创建的时候就已经知道该对象占用内存的大小,而对于去...

  • 如何查看java对象大小及其地址

    解密java对象的地址及大小: 一个对象的大小等于:对象头+属性占用空间(基础类型+引用类型 8Byte)关闭指针...

  • 如何计算Java对象所占内存的大小

    摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论...

  • 如何计算Java对象所占内存的大小

    摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论...

  • 如何计算java对象的大小?

    1. 了解对象的内存布局? 2. 每部分占用多少字节说明 2.1 对象头区域 2.1.1 对象头 Mark ...

  • java学习常用辅助工具总结

    1. java对象结构查看-JOL 描述:openjdk提供的一个查看java对象的小工具官网:jol官网链接基本...

  • java对象大小

    java对象包括对小偷,实例数据和对齐填充 任何一个对象都有对象头,对象头在32位系统上占用,64位系统上占用16...

  • JS对象基本用法

    声明对象的两种语法 如何删除对象属性 如何查看对象的属性 查看自身所有属性 查看自身+共有属性 判断一个属性是自身...

网友评论

      本文标题:如何查看一个 Java 对象的大小

      本文链接:https://www.haomeiwen.com/subject/ejevlxtx.html