内存优化中的Shallow Size和Retained Size是啥?

7,318 阅读2分钟

想要说清楚Retained size就必须要提到shallow Size。

Shallow Size

shallow size: 是指实例自身占用的内存, 可以理解为保存该'数据结构'需要多少内存, 注意不包括它引用的其他实例

计算公式:

Shallow Size = [类定义] + 父类fields所占空间 + 自身fields所占空间 + [alignment]
  1. 类定义是指, 声明一个类本身所需的空间, 固定为8byte, 也就是说, 一个不包含任何fields的类的'空类', 也需要占8byte; 另外类定义空间不会重复计算, 就是说, 即使类继承其他类, 也只算8byte
  2. 父类fields所占空间, 对于继承了其他类的类来说, 父类声明的fields显然需要占用一定的空间
  3. 自身fields所占空间, 所有fields所占空间之和; fields分基本类型和引用, 基本类型所占空间和系统有关, 例如在32位系统中int=4byte, 64位系统中int=8byte; 引用固定占4byte, 例如String name;这个变量声明占4byte.
  4. 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关系

先借用一张图,这张图更能清楚的表示他们之间的计算关系。

image.png

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 单位是什么