java 中Shallow Heap与Retained Heap的区别
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的区别相关推荐
- Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?
原文在这里: Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思? MAT是一款非常强大的JVM内存映像分析工具,对分析内存相关的问题非常有用,MAT报告中对 ...
- MAT工具学习,incoming reference和outgoing reference,Shallow Heap和Retained Heap
MAT工具学习 incoming reference和outgoing reference Shallow Heap和Retained Heap 常用工具 一般思路 incoming referenc ...
- java中堆栈(stack)和堆(heap)
http://www.ej38.com/showinfo/java-172156.html 堆栈是一种先进后出的数据结构,只能在一端进行输入或输出数据的操作 Stack类在java.util包中 向 ...
- Java中的SoftReference和WeakReference有什么区别?
本文翻译自:What's the difference between SoftReference and WeakReference in Java? java.lang.ref.WeakRefer ...
- java中String new和直接赋值的区别
Java中String new和直接赋值的区别 对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才 ...
- 【Java学习笔记之二十九】Java中的equals和==的用法及区别
Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String(&quo ...
- Java中print、printf、println的区别 详解
Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...
- Java中方法重载和方法重写的区别
文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...
- Java中的LongAdder和AtomicLong有什么区别?
● Java中的LongAdder和AtomicLong有什么区别? 考点:JDK 参考回答: JDK1.8引入了LongAdder类.CAS机制就是,在一个死循环内,不断尝试修改目标值,直到修改成功 ...
- Java中 byte[]数组序列化和fastjson序列化区别
Java中 byte[]数组序列化和fastjson序列化区别 Java中,对于对象可以通过序列化成byte数组或者序列化成json形式,这里做下两者的对比. 首先看下实现方式: 1 byte数组序列 ...
最新文章
- windowsphone开发_[app开发定制公司]开发app需要什么技术呢?
- Learning Less is More – 6D Camera Localization via 3D Surface Regression
- char *a 与char a[] 的区别和char** argv与char *argv[]区别
- SQL Server 不同数据库导入指定数据解决方案
- python做数据可视化视频_Python数据分析系列视频课程--玩转数据可视化
- 个人简历中计算机应用能力,年中计算机应用专业个人简历模板.docx
- Redis之Redis事务
- 5. Adapter Pattern(适配器模式)
- springboot建筑造价师资格考试应试网站设计与实现毕业设计源码260839
- iOS透明导航栏的平滑过渡(进阶版)
- DAPLink-Firmware
- 第九周 棚拍静物——让你的照片更有味道
- 聚观早报 | 嘀嗒出行重启赴港IPO;饿了么到店业务将与高德合并
- 红黑树和红黑树的原理详解
- android 7.0关机动画,Android 修改系统关机动画的实现
- 新手建站如何选择云服务器配置?以阿里云ecs云服务器为例说明
- Conflux 树图区块链 “数字藏品 合约标准和编写规范
- 视频教程-20年Nodejs教程零基础入门到项目实战前端视频教程-Node.js
- 从零开始编写自己的C#框架(8)——后台管理系统功能设计
- 健康小贴士(肚子疼)
热门文章
- python学习笔记6--双色球需求实现
- 零基础学python实战答案-Python3.6零基础入门与实战 PDF 带源码视频版
- centos php安装 pecl,pecl是什么?如何在centos下安装pecl?
- 如何给php安装上pecl,PHP安装PECL扩展的方法
- Android基础入门教程——4.1.2 Activity初窥门径
- E08【选尺码】I'm looking for size 43
- Unity Recorder屏幕录制问题
- lempel ziv算法c语言,数学之路-python计算实战(4)-Lempel-Ziv压缩(2)(示例代码)
- 华为人均工资70万人人想要,可华为员工16项标准你能做到几条?
- 情绪识别(python opencv dlib)