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

最近一直着迷于缓存行,要想正确理解缓存行以及伪共享就一定要知道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包后保持如下的相对路径 和你要测试的类在一起.



写一个对象来查看:


例如 上面的这个类在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

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

示例代码:


有压缩:



没有压缩:



发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();