Shallow Size

Shallow Size是对象本身占据的内存的大小,不包含其引用的对象。对于常规对象(非数组)的Shallow Size由其成员变量的数量和类型来定,而数组的ShallowSize由数组类型和数组长度来决定,它为数组元素大小的总和。


Retained Size

Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C,C就是间接引用) ,并且排除被GC Roots直接或者间接引用的对象

换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。 
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。 
 
GC Roots直接引用了A和B两个对象。

A对象的Retained Size=A对象的Shallow Size 
B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size

示例:


上图中obj1的retained size为obj1、obj2、obj4的shallow size总和,并不包括obj3的shallow size,因为obj3被Gc Roots引用了,也就是说obj3除了被obj2引用,还有其他外部引用。

上图中obj1的retained size为obj1、obj2、obj3、obj4的shallow size总和,因为obj3除了被obj2引用,没有其他外部引用。


GC Roots可达性

  • 虚拟机栈的栈帧的局部变量表所引用的对象;
  • 本地方法栈的JNI所引用的对象;
  • 方法区的静态变量和常量所引用的对象;

关于可达性的对象,便是能与GC Roots构成连通图的对象,如下图:

根搜索算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain)当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

从上图,reference1、reference2、reference3都是GC Roots,可以看出: 
reference1-> 对象实例1; 
reference2-> 对象实例2; 
reference3-> 对象实例4; 
reference3-> 对象实例4 -> 对象实例6; 
可以得出对象实例1、2、4、6都具有GC Roots可达性,也就是存活对象,不能被GC回收的对象。 
而对于对象实例3、5直接虽然连通,但并没有任何一个GC Roots与之相连,这便是GC Roots不可达的对象,这就是GC需要回收的垃圾对象。

java 中Shallow Heap与Retained Heap的区别相关推荐

  1. Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?

    原文在这里: Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思? MAT是一款非常强大的JVM内存映像分析工具,对分析内存相关的问题非常有用,MAT报告中对 ...

  2. MAT工具学习,incoming reference和outgoing reference,Shallow Heap和Retained Heap

    MAT工具学习 incoming reference和outgoing reference Shallow Heap和Retained Heap 常用工具 一般思路 incoming referenc ...

  3. java中堆栈(stack)和堆(heap)

    http://www.ej38.com/showinfo/java-172156.html 堆栈是一种先进后出的数据结构,只能在一端进行输入或输出数据的操作  Stack类在java.util包中 向 ...

  4. Java中的SoftReference和WeakReference有什么区别?

    本文翻译自:What's the difference between SoftReference and WeakReference in Java? java.lang.ref.WeakRefer ...

  5. java中String new和直接赋值的区别

        Java中String new和直接赋值的区别     对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才 ...

  6. 【Java学习笔记之二十九】Java中的equals和==的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String(&quo ...

  7. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

  8. Java中方法重载和方法重写的区别

    文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...

  9. Java中的LongAdder和AtomicLong有什么区别?

    ● Java中的LongAdder和AtomicLong有什么区别? 考点:JDK 参考回答: JDK1.8引入了LongAdder类.CAS机制就是,在一个死循环内,不断尝试修改目标值,直到修改成功 ...

  10. Java中 byte[]数组序列化和fastjson序列化区别

    Java中 byte[]数组序列化和fastjson序列化区别 Java中,对于对象可以通过序列化成byte数组或者序列化成json形式,这里做下两者的对比. 首先看下实现方式: 1 byte数组序列 ...

最新文章

  1. windowsphone开发_[app开发定制公司]开发app需要什么技术呢?
  2. Learning Less is More – 6D Camera Localization via 3D Surface Regression
  3. char *a 与char a[] 的区别和char** argv与char *argv[]区别
  4. SQL Server 不同数据库导入指定数据解决方案
  5. python做数据可视化视频_Python数据分析系列视频课程--玩转数据可视化
  6. 个人简历中计算机应用能力,年中计算机应用专业个人简历模板.docx
  7. Redis之Redis事务
  8. 5. Adapter Pattern(适配器模式)
  9. springboot建筑造价师资格考试应试网站设计与实现毕业设计源码260839
  10. iOS透明导航栏的平滑过渡(进阶版)
  11. DAPLink-Firmware
  12. 第九周 棚拍静物——让你的照片更有味道
  13. 聚观早报 | 嘀嗒出行重启赴港IPO;饿了么到店业务将与高德合并
  14. 红黑树和红黑树的原理详解
  15. android 7.0关机动画,Android 修改系统关机动画的实现
  16. 新手建站如何选择云服务器配置?以阿里云ecs云服务器为例说明
  17. Conflux 树图区块链 “数字藏品 合约标准和编写规范
  18. 视频教程-20年Nodejs教程零基础入门到项目实战前端视频教程-Node.js
  19. 从零开始编写自己的C#框架(8)——后台管理系统功能设计
  20. 健康小贴士(肚子疼)

热门文章

  1. python学习笔记6--双色球需求实现
  2. 零基础学python实战答案-Python3.6零基础入门与实战 PDF 带源码视频版
  3. centos php安装 pecl,pecl是什么?如何在centos下安装pecl?
  4. 如何给php安装上pecl,PHP安装PECL扩展的方法
  5. Android基础入门教程——4.1.2 Activity初窥门径
  6. E08【选尺码】I'm looking for size 43
  7. Unity Recorder屏幕录制问题
  8. lempel ziv算法c语言,数学之路-python计算实战(4)-Lempel-Ziv压缩(2)(示例代码)
  9. 华为人均工资70万人人想要,可华为员工16项标准你能做到几条?
  10. 情绪识别(python opencv dlib)