内存优化中的Shallow Size和Retained Size是啥?
想要说清楚Retained size就必须要提到shallow Size。
Shallow Size
shallow size: 是指实例自身占用的内存, 可以理解为保存该'数据结构'需要多少内存, 注意不包括它引用的其他实例
计算公式:
Shallow Size = [类定义] + 父类fields所占空间 + 自身fields所占空间 + [alignment]复制代码
类定义
是指, 声明一个类本身所需的空间, 固定为8byte, 也就是说, 一个不包含任何fields的类的'空类', 也需要占8byte; 另外类定义空间不会重复计算, 就是说, 即使类继承其他类, 也只算8byte父类fields所占空间
, 对于继承了其他类的类来说, 父类声明的fields显然需要占用一定的空间自身fields所占空间
, 所有fields所占空间之和; fields分基本类型和引用, 基本类型所占空间和系统有关, 例如在32位系统中int=4byte, 64位系统中int=8byte; 引用固定占4byte, 例如String name;
这个变量声明占4byte.alignment
是指位数对齐, 会让总空间为8的倍数, 例如某个A类, 以上3项计算出来为15byte, 那么为了对齐, 让它是8的倍数, 会取最接近的值, 所以它的Shallow Size是16byte;
Retained Size
实例A的
Retained Size
是指, 当实例A被回收时, 可以同时被回收的实例的Shallow Size之和
所以进行内存分析时, 我们应该重点关注Retained Size较大的实例; 或者可以通过Retained Size判断出某A实例内部使用的实例是否被其他实例引用.
Shallow Size 与 Retained Size关系
先借用一张图,这张图更能清楚的表示他们之间的计算关系。
B的shallow size = B;
B的retained size = B shallow size + C retained size + D retained size;
单位
Shallow Size 与 Retained Size的单位是Byte
参考:
Shallow Size和Retained Size详解
java retained size_java中使用MAT是shallow size 单位是什么
作者:心在梦在
链接:https://juejin.cn/post/7020706981652463629