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

摘要

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

写一个对象来查看:

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<V> 
         *          // 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;  
}

有压缩:

没有压缩:

IT家园
IT家园

网友最新评论 (0)