虚拟机对象是否存活

注:本篇内容来源于《深入理解java虚拟机》
在堆里面存放真java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是确定这些对象之中哪些还“存活”着,哪些已经“死去”。

  1. 可达性分析算法:
    这个算法的基本思路:通过一系列的称为“GC Roots"的对象作为起始点,从这个结点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象不可用。
    如下图:对象object5,object6,object7虽然互有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。
    在这里插入图片描述
    在java语言中,可以作为GC Roots的对象包括下面几种:
    1,虚拟机栈(栈帧中的本地变量表)中引用的对象;
    2,方法区中类静态属性引用的对象;
    3,方法区中常量引用的对象;
    4,本地方法栈中JNI(即一般说的Native方法)引用的对象。

在堆中,尤其是新生代中,常规应用进行一次垃圾回收一般可以回收70%~95%的空间,而永久代的垃圾收集效率远低于此。
永久代的垃圾收集主要回收两部分:废弃常量和无用的类。
以常量池中字面量的回收为例,例如一个字符串"abc"已经进入了常量池中,但是当前系统没有一个String对象是叫”abc"的,换句话说,就是没有任何String对象引用常量池中的“abc"常量,也没有其他地方引用了这个字面量,如果这时发生内存回收,而且必要的话,这个"abc"常量就会被系统清理出常量池。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值