编写不易,转载请注明(http://shihlei.iteye.com/blog/2407693)!
一 概述
最近需求,打算再内存缓存数据,数据量130000万并且还会增加,了解这些数据占用空间的大小是很常见的监控需要。
常规方式,人工可以按照Java基础数据类型大小及内容大小估算出缓存对象的大概堆占用,但是麻烦还不准。
OpenJDK,提供了JOL包,可以帮我们在运行时计算某个对象的大小,是非常好的工具
官网:http://openjdk.java.net/projects/code-tools/jol/
定位:分析对象在JVM的大小和分布
依赖:
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>put-the-version-here</version> </dependency>
二 使用
1)准备一个map,用于测试JOL Api的结果
static Object generate() { Map<String, Object> map = new HashMap<>(); map.put("a", new Integer(1)); map.put("b", "b"); map.put("c", new Date()); for (int i = 0; i < 10; i++) { map.put(String.valueOf(i), String.valueOf(i)); } return map; }
2)常用的几个方法
(1)查看对象内部信息: ClassLayout.parseInstance(obj).toPrintable()
(2)查看对象外部信息:包括引用的对象:GraphLayout.parseInstance(obj).toPrintable()
(3)查看对象占用空间总大小:GraphLayout.parseInstance(obj).totalSize()
三 完整Demo
package x.demo.java; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.info.GraphLayout; public class JolDemo { static Object generate() { Map<String, Object> map = new HashMap<>(); map.put("a", new Integer(1)); map.put("b", "b"); map.put("c", new Date()); for (int i = 0; i < 10; i++) { map.put(String.valueOf(i), String.valueOf(i)); } return map; } static void print(String message) { System.out.println(message); System.out.println("-------------------------"); } public static void main(String[] args) { Object obj = generate(); //查看对象内部信息 print(ClassLayout.parseInstance(obj).toPrintable()); //查看对象外部信息 print(GraphLayout.parseInstance(obj).toPrintable()); //获取对象总大小 print("size : " + GraphLayout.parseInstance(obj).totalSize()); } }
相关推荐
4. 对象对齐(Object Alignment):Java对象在内存中是以特定的对齐方式进行存储的,JOL可以展示这种对齐策略,有助于优化内存使用。 5. 数组布局(Array Layout):对于数组对象,JOL还能展示数组元素是如何存储的...
- **JOL (Java Object Layout)**:由Azul Systems开发的轻量级库,通过反射和JNI技术来计算对象的精确大小。 6. **源码分析**:通过阅读JVM的源码,如OpenJDK,可以更深入地理解对象是如何在内存中布局的。 7. **...
【标题】"jol:졸작" 暗示了我们正在讨论的是一个与Java对象布局(JOL,Java Object Layout)相关的项目或工具,可能是某个开发者或团队的作品。"졸작"在韩语中意味着“草稿”或“初步尝试”,这可能表示这是一个早期...
2. **JOL (Java Object Layout)**:JOL是一个轻量级库,它可以提供精确的对象布局信息。通过JOL,开发者可以打印出对象各个部分的具体大小。 3. **Instrumentation API**: - Java的`java.lang.instrument....
"Java对象布局(JOL)实现过程解析" Java对象布局(JOL)是Java虚拟机(JVM)中的一种对象布局方式,用于描述对象在堆内存中的布局。JOL提供了详细的对象布局信息,包括对象头、基本变量、引用变量、补齐等部分。 对...
openjdk的一个工具,他可以很方便的让我看到一个对象的布局
例如,`org.openjdk.jol`(Java Object Layout)库提供了一种方便的方式来获取对象的内存布局信息。 总结来说,这个例子旨在帮助开发者理解Java对象在内存中的表示方式,以及不同类型和结构的对象如何影响内存使用...
此外,JOL库(Java Object Layout)是一个非常有用的工具,可以帮助我们分析JVM中对象的内存布局。通过引入该库,可以方便地获取对象和数组的详细内存占用信息。 总之,Java对象和数组的内存占用取决于JVM的配置、...
Java synchronized锁升级jol过程详解 Java synchronized锁升级jol过程详解是Java并发编程中一个重要的概念,了解锁升级过程对Java开发者来说非常重要。本文将通过示例代码详细介绍Java synchronized锁升级jol过程...
可以查阅java虚拟机中对象的内存分布,是OpenJDK的Code Tools项目中的工具,具体可以通过如下两套指令来实现: $ java -jar /path/to/jol-cli-0.9-full.jar internals java.util.HashMap $ java -jar /path/to/jol-...
为了查看Java对象的实际内存布局,可以利用如OpenJDK的JOL(Java Object Layout)工具。通过运行特定的Java代码,可以打印出对象在内存中的详细结构,从而了解MarkWord和Klass Pointer等信息。 总结来说,...
对jol-core-0.10.jar进行拓展,打印二进制头信息Mark Word 用法: ClassLayout.parseInstance(对象).toPrintableSimple(true) toPrintableSimple():true 表示二进值,false 表示 十六进制
jol-cli-0.4-full.jar JOL
包含jol-cli的全部jar包: jol-cli-0.9-full.jar jol-cli-0.9-javadoc.jar jol-cli-0.9-sources.jar jol-cli-0.9.jar
文档中提到了使用`org.openjdk.jol`工具包的`ClassLayout`和`GraphLayout`类来查看对象的内存布局,以便了解锁的状态。例如,通过`parseInstance`方法获取对象的打印表示,从而观察Mark Word的变化。 7. JVM参数...
本文将深入探讨C++对象的内存布局情况,包括对象的构造、析构、内存对齐、成员变量的顺序以及静态与动态内存分配等方面。 首先,我们从对象的创建开始。在C++中,对象可以通过两种方式创建:栈(Stack)上的对象和...
- **Bytecode Analysis**: Techniques for analyzing bytecode using tools like JD-GUI and JOL (Java Object Layout). **6. Understanding Performance Tuning** - **Overview**: Focuses on optimizing Java ...
对象大小 java-op-db connection-pool-test 连接池测试,包含高性能HikariCP,提供强大的监控和扩展功能druid MyBatis-demo MyBatis 测试 http-client-demo retrofit-test resume-parse Apache httpclient 测试 ...
为了实际观察内存布局,我们可以使用第三方库JOL(Java Object Layout)。例如,创建一个简单的对象,然后使用`ClassLayout.parseInstance()`方法获取其布局信息。在实验中,我们能看到随着对象字段的增加,对象头、...
word源码java concurrency 并发 <groupId>org.openjdk.jol <artifactId>jol-core <version>0.8 out.println(ClassLayout.parseInstance(student).toPrintable()); -XX:+UseBiasedLocking ...关于java对象头的一