编写不易,转载请注明(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()); } }
相关推荐
Java对象布局(JOL,Java Object Layout)是一个强大的工具,用于深入理解Java对象在内存中的布局情况。这个工具可以帮助开发者优化内存使用,提高程序性能,尤其是在处理大量对象或高并发场景时。JOL 0.9是其一个...
首先,Java对象的大小不仅仅包括其字段的大小,还包括对象头(object header)的大小,对于HotSpot虚拟机,它包含了对齐填充、Mark Word、Klass Pointer等部分。此外,如果对象是数组,还需要考虑数组长度字段。理解...
【标题】"jol:졸작" 暗示了我们正在讨论的是一个与Java对象布局(JOL,Java Object Layout)相关的项目或工具,可能是某个开发者或团队的作品。"졸작"在韩语中意味着“草稿”或“初步尝试”,这可能表示这是一个早期...
2. **JOL (Java Object Layout)**:JOL是一个轻量级库,它可以提供精确的对象布局信息。通过JOL,开发者可以打印出对象各个部分的具体大小。 3. **Instrumentation API**: - Java的`java.lang.instrument....
本示例主要探讨如何测试Java对象占用的内存大小,以便更好地理解内存使用情况。 首先,`SizeOf.java`可能是一个实现自定义内存大小计算的类。在Java中,由于垃圾回收机制的存在,直接获取对象的内存占用并不像C++等...
总之,Java对象和数组的内存占用取决于JVM的配置、对象的字段、数组的元素类型和长度等因素。开启或关闭压缩选项会影响对象和数组引用的大小,进而影响整体的内存占用。对于内存优化和性能调优来说,了解这些细节至...
了解锁升级的过程,首先要理解Java对象在内存中的布局。一个Java对象通常包含三部分:对象头、实例数据和对齐填充。 1. **对象头**: - **Mark Word**:存储对象的运行时数据,如对象的哈希码、GC分代年龄、锁状态...
- `org.openjdk.jol`(Java Object Layout):可以用于分析对象的内存布局和内存消耗,间接影响性能。 - `HdrHistogram`:高动态范围直方图库,适用于记录和分析延迟数据,帮助理解系统的延迟特性。 7. **代码...