编写不易,转载请注明(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()); } }