今天,小F给大家介绍一款工具JOL,可以满足大家对java对象的所有想象。 02 JOL简介 JOL的全称是Java Object Layout。是一个用来分析JVM中Object布局的小工具。 JOL可以在代码中使用,也可以独立的以命令行中运行。命令行的我这里就不具体介绍了,今天主要讲解怎么在代码中使用JOL。 使用JOL需要添加maven依赖: <dependency> <groupId>org.openjdk.jol</groupId> <artifactId 04 使用JOL分析String 上面的都不是重点,重点是怎么使用JOL来分成class和Instance信息。 其实java中的对象,除了数组,其他对象的大小应该都是固定的。 07 使用JOL分析引用关系 上面我们使用JOL分析的是class内部的空间使用情况,那么如果有外部引用可不可以分析呢?
引入jol工具包,它可以把java对象在jvm内存中布局的情况打印出来,看一下对象在jvm中是怎么存在的 <dependency> <groupId>org.openjdk.jol</groupId > <artifactId>jol-core</artifactId> <version>0.15</version> <scope>provided</scope> </dependency > demo代码: package com.example.learningdemo.demo; import org.openjdk.jol.info.ClassLayout; /** * @author
build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) 我用openJDK的jol 来查看对象的layout,源码如下,直接运行main方法, List-2 package com.mjduan.project.openjdk_jol_example; import org.openjdk.jol.info.ClassLayout 2.2 验证Java数组对象的头部占用byte数 List-3 验证数组的情况 import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.vm.VM List-4 import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.vm.VM; /** * @author dmj1161859184 图3 List-4的运行结果 List-5 import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.vm.VM; /** *
使用JOL工具查看内存布局(验证理论步骤) JOL工具说明 查看普通java对象的内部布局工具JOL(JAVA OBJECT LAYOUT),使用此工具可以查看new出来的一个java对象的内部布局 -- 查看Java 对象布局、大小工具 --> <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core< 针对TestObject1类产生的对象,利用jol查看64位系统java对象(空对象),默认开启指针压缩,总大小显示16字节,前12字节为对象 额外拓展说明: OFFSET:偏移地址,单位字节 针对TestObject2类产生的对象,利用jol查看64位系统java对象(非空对象),默认开启指针压缩,总大小显示24字节,前12字节为对象 3.
设置 为了检查 JVM 中对象的内存布局,我们将广泛使用 Java 对象布局 (JOL)。 因此,我们需要添加jol-core依赖项: <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId 对象尺寸 如果我们要求 JOL 根据对象大小打印虚拟机详细信息: System.out.println(VM.current().details());Copy 启用压缩引用(默认行为)后,我们将看到输出 (OOP) 现在我们知道布尔值是 1 个字节,让我们考虑这个简单的类: class BooleanWrapper { private boolean value; }Copy 如果我们使用 JOL 检查此类的内存布局: System.out.println(ClassLayout.parseClass(BooleanWrapper.class).toPrintable());Copy 然后 JOL
实践出真知 下面来通过openjdk jol 来解读对象占用多少字节。 JOL JOL(Java Object Layout)是用于分析 JVM 中对象布局方案的微型工具箱。 这使得 JOL 比其他依赖堆转储、规范假设等的工具更准确。 示例 创建一个maven项目,引入依赖 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId /float 4 char/short 2 byte/boolean 1 oops(Ordinary Object Pointers) 4 总结 通过我们上述测试得到的表格,在不依赖openjdk jol
JOL(Java Object Layout)是一个非常好用的工具,它能显示对象的各个字段在内存中的分布情况。不过,我一开始用的时候,感觉有点复杂,毕竟它需要依赖一些库,而且输出的信息也比较专业。 我记得第一次用JOL的时候,写了一个简单的测试类,然后运行了一下,结果输出了一大堆信息。当时看得一脸懵,不知道该怎么解读。后来慢慢摸索,才发现这些信息其实很直观。 除了JOL,还有一些其他的工具,比如jstat、jmap、VisualVM等。不过这些工具主要用来监控GC和内存使用情况,而不是直接查看对象的内存布局。 所以,如果你想深入了解对象的结构,还是建议使用JOL。 不过,我得说一句,JOL虽然强大,但也不是万能的。有时候它的输出信息可能会让人困惑,尤其是对于刚接触的人来说。 如果你也在学习Java,或者正在做性能优化,那么不妨试试JOL,看看你的对象到底是怎么被分配内存的。说不定,你会发现一些意想不到的优化点。
顺便介绍个查看对象的属性位置分布的一个小工具:jol 使用Demo: 首先引用jol-core包 <! -- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core --> <dependency> <groupId>org.openjdk.jol </groupId> <artifactId>jol-core</artifactId> <version>0.9</version> </dependency> 然后在项目里简单使用下
对于 T t = new T(); 其实有如下字节码指令完成 _new 'org/openjdk/jol/T' dup INVOKESPECIAL org/openjdk/jol/T.
因此,我们需要用到一个三方的jar包工具jol来对java对象进行查看。 1.1 导入jol 导入的方式比较简单,我们只需要在pom文件中添加如下内容即可: <! -- 查看内存布局--> <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId > <version>0.10</version> </dependency> 之后就可以使用jol来查看对象的内存布局了。 但是需要注意的是,这里每次输出的都是4个字节,再第一行的内部,jol已经帮我们做了处理。因此现在看起来第一行的最后两位才是我们上表中的锁状态位。 #4 // Method org/openjdk/jol/info/ClassLayout.toPrintable:()Ljava/lang/String;
但是对于那句话,不同的人有不同的理解; 举个例子: import org.openjdk.jol.info.ClassLayout; import org.junit.Test; import org.openjdk.jol.info.ClassLayout extends Person { public ExtendPerson() {} } ClassLayout需要引入依赖: <dependency> <groupId>org.openjdk.jol </groupId> <artifactId>jol-core</artifactId> <version>0.8</version> </dependency> 从上面的例子中可以看出,父类的私有成员在子类的内存中是出现了的
相关校验过程 引入jar包 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.8</version> </dependency> jol-core 常用的三个方法 ClassLayout.parseInstance(object).toPrintable( \jol-core\0.8\jol-core-0.8.jar" com.lock.PartialLock 未锁com.lock.PartialLock object internals: OFFSET \jol-core\0.8\jol-core-0.8.jar" com.lock.GentlyLock 偏向锁com.lock.GentlyLock object internals: OFFSET \jol-core\0.8\jol-core-0.8.jar" com.lock.WeightLock com.lock.WeightLock object internals: OFFSET SIZE
: 保存偏向时间戳 markword(64位)分布图,对象布局、GC回收和后面的锁升级就是对象标记MarkWord里面标志位的变化 5、Object obj = new Object()解析 1、JOL 证明 JOL <! -- 定位:分析对象在JVM的大小和分布 --> <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core
打印对象状态 JOL(Java Object Layout)一款开源的用于分析 JVM 中对象布局的一个小工具。 这使得 JOL 比其他依赖堆转储、规范假设等的工具更准确。 maven 仓库依赖如下: <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> ; import org.openjdk.jol.info.GraphLayout; public class ObjectTest2 { public static void main(String www.oracle.com/technetwork/java/javase/tech/biasedlocking-oopsla2006-preso-150106.pdf https://github.com/openjdk/jol
简介 在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址。 今天,我们会更进一步,剖析一下在之前文章中没有讲解到的更深层次的细节。一起来看看吧。 工具当然是使用JOL: @Slf4j public class JolUsage { @Test public void useJol(){ log.info("{}" 有的小伙伴可能发现了问题,之前我们用JOL解析Object对象的时候,Object head大小是12字节,也就是96bits,这里怎么写的是128bits? ? 我们用JOL再看一次: log.info("{}",ClassLayout.parseClass(byte[].class).toPrintable()); log.info("{}",ClassLayout.parseInstance
jctools-core</artifactId> <version>2.1.2</version> </dependency> <dependency> <groupId>org.openjdk.jol </groupId> <artifactId>jol-core</artifactId> <version>0.9</version> </dependency> package com.infuq.memory ; import org.jctools.util.UnsafeAccess; import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.vm.VM
简介 之前的文章中,我们使用JOL工具简单的分析过String,数组和集合类的内存占用情况,这里再做一次更详细的分析和介绍,希望大家后面再遇到OOM问题的时候不再抱头痛哭,而是可以有章可循,开始吧。 数组 先看下JOL的代码和输出: //byte arraylog.info("{}",ClassLayout.parseInstance("www.flydean.com".getBytes()).toPrintable 同样的我们还是用JOL来分析: //Stringlog.info("{}",ClassLayout.parseInstance("www.flydean.com").toPrintable()); 输出结果
使用 JOL 分析对象内存布局 这一节我们演示使用 JOL(Java Object Layout)[3] 来分析 Java 对象的内存布局。 : Only HotSpot/OpenJDK VMs are supported 3.1 使用步骤 现在,我们使用 JOL 分析 new Object() 在 HotSpot 虚拟机上的内存布局,模板程序如下 : 示例程序 // 步骤一:添加依赖 implementation 'org.openjdk.jol:jol-core:0.11' // 步骤二:创建对象 Object obj = new Object 如下图所示: 提示: 在上文使用 JOL 分析对象内存布局时,输入日志 Using compressed oop with 3-bit shift. (Java Object Layout): https://openjdk.org/projects/code-tools/jol/ [4] 深入理解 Java 虚拟机(第 3 版)(第 1、3、13
导入JOL依赖 <! -- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core --> <dependency> < groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>
JVM中开辟的内存空间必须是8字节的倍数, 如果缺少位数,需要补全为8的倍数; 以上各字段共28字节,需补全4字节 所以MyObject对象共占用8+4+0+16+4=32字节 下面利用openjdk的jol 最后,附上openjdk.jol的maven依赖 <dependency> <groupId>org.openjdk.jol</groupId> <version>0.9</version > <artifactId>jol-cli</artifactId> </dependency>