JVM中的Shallow Size 和 Retained Size解释
在使用相关的JVM内存工具查看堆栈情况时, 有两个指标Shallow Size
和Shallow Size
不是很清楚其真正含义,现在通过一个例子来了解其含义。
先说一下概念描述:
- shallow size: 对象自身占用的内存, 不包括它引用的其他实例。例如,对于一个简单的对象,如果它有几个基本数据类型的字段和对其他对象的引用,那么该值只计算这些字段所占的空间,而不计算被引用对象的空间
- retained size: 当实例A被回收时, 可以同时被回收的实例的Shallow Size之和
示例代码很简答, 构造一个List,然后插入100万个元素, 在程序运行的过程中使用IDEA自带的Profiler来获取堆栈快照,后面的一个无限循环是为了防止程序运行完终止。
1 | public static void main(String[] args) throws Exception { |
结果如下图所示:
可以看到,List实例的shallow size很小,因为其代表本身这个List对象占用的内存,不包含其引用的100万的Integer对象, 而retained size很大,接近29M。
在此处, 想验证一下long类型和int类型各自占用的空间占用区别有多大。
将Integer改成了Long, 其他不变,观察retained size,接近33M,和int的差距不是很大。
评论