这个文章说得非常好:https://www.yourkit.com/docs/java/help/sizes.jsp#:~:text=YourKit%20Java%20Profiler%20is%20capable%20of%20measuring%20shallow,the%20number%20and%20types%20of%20%20its%20fields.
Shallow size:用于存储一个对象的内存大小,它引用的对象不计算在内。
Retained size:一个对象的Shallow size加上只有它可以直接或间接访问到的对象的Shallow size。当这个对象被回收时,Retained size所代表的内存都可以被回收。
引用文章开头的两张图:
参考上图,Shallow size 就是图中每个对象分到的内存大小。
在Figure1中:
obj1的Retained size = obj1+obj2+obj4
为什么obj5和obj3为什么不计算进来呢?因为它们不只有obj1直接或间接访问。
在Figure2中:
obj1的Retained size = obj1+obj2+obj3+obj4
不加obj5,是因为除了obj1,它还有其他对象访问它。
所以,在Figure1中,当obj1被垃圾回收时,obj2,obj4都会被回收。
在Figure2中,当obj1被垃圾回收时,obj2,obj3,obj4都会被回收。