在使用相关的JVM内存工具查看堆栈情况时, 有两个指标Shallow SizeShallow Size不是很清楚其真正含义,现在通过一个例子来了解其含义。

先说一下概念描述:

  • shallow size: 对象自身占用的内存, 不包括它引用的其他实例。例如,对于一个简单的对象,如果它有几个基本数据类型的字段和对其他对象的引用,那么该值只计算这些字段所占的空间,而不计算被引用对象的空间
  • retained size: 当实例A被回收时, 可以同时被回收的实例的Shallow Size之和

示例代码很简答, 构造一个List,然后插入100万个元素, 在程序运行的过程中使用IDEA自带的Profiler来获取堆栈快照,后面的一个无限循环是为了防止程序运行完终止。

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) throws Exception {
List<Integer> l = new ArrayList<>();
for (int i=0; i < 1000000; i++){
l.add(i);
}
while (true){
TimeUnit.SECONDS.sleep(3);
System.out.println("sdsdsds");
}
}

结果如下图所示:

可以看到,List实例的shallow size很小,因为其代表本身这个List对象占用的内存,不包含其引用的100万的Integer对象, 而retained size很大,接近29M。

在此处, 想验证一下long类型和int类型各自占用的空间占用区别有多大。

将Integer改成了Long, 其他不变,观察retained size,接近33M,和int的差距不是很大。