欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

要想正确理解缓存行以及伪 CAD加密 共享就一定要知道Java对象的大小

点击: 次  来源:宝鼎软件 时间:2017-07-30

原文出处: scugxl

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

要想正确领略缓存行以及伪 CAD加密 共享就必然要知道Java工具的巨细

写一个工具来查察:

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 字节,正好攒够一个缓存行巨细,

要想正确领略缓存行以及伪 CAD加密 共享就必然要知道Java工具的巨细

工具头8 字节 + 8 (value long巨细) + 6*8 (填充) = 64 字节

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

要想正确领略缓存行以及伪 CAD加密 共享就必然要知道Java工具的巨细

工具头12字节 (可是要对齐8字节 所以工具头总共16字节.)
64bit不开启指针压缩:

要想正确领略缓存行以及伪 CAD加密 共享就必然要知道Java工具的巨细

工具头为完整的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;  
    }

    有压缩:

    要想正确领略缓存行以及伪 CAD加密 共享就必然要知道Java工具的巨细

    没有压缩:

    要想正确领略缓存行以及伪 CAD加密 共享就必然要知道Java工具的巨细

    图纸加密,软件开发,软件开发