JOL:查看Java 对象布局、大小工具
编写不易,转载请注明(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());
}
}