• 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。 
     Retained Heap
    GC Roots直接引用了A和B两个对象。

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

    示例:

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

    å¾2

    上图中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需要回收的垃圾对象。

  • 相关阅读:
    传真机换色带
    系统无法安装 OfficeControl.ocx 控件如何解决
    体系结构
    WebOffice 插件
    ArcMAP定义投影坐标
    如何在AutoCAD中将卫星底图变为有坐标参考信息的
    AutoCAD中导入图片
    CGCS2000坐标系与其他坐标系间的差异和转换方法
    FTP服务器(SOCKET)返回异常 500 Command not understood
    Java微信公众平台开发--番外篇,对GlobalConstants文件的补充
  • 原文地址:https://www.cnblogs.com/gmhappy/p/11864002.html
Copyright © 2020-2023  润新知