JVM垃圾回收机制

一、常量池的位置

 方法区和永久代以及元空间是什么关系呢? 方法区和永久代以及元空间的关系很像 Java 中接口和类的关系,类实现了接口,这里的类就可以看作是永久代和元空间,接口可以看作是方法区,也就是说永久代以及元空间是 HotSpot 虚拟机对虚拟机规范中方法区的两种实现方式。并且,永久代是 JDK 1.8 之前的方法区实现,JDK 1.8 及以后方法区的实现变成了元空间

二、 堆的结构

演变

 

永久代中存启动类依赖的java类,不存在垃圾回收,关闭jvm才会回收内存。 

打印堆结构

-XX:+PrintGCDetails

三、堆中存放对象的规则 

1. 对象优先分配在Eden伊甸园区,如果Eden没有空间了会发动一次Minor GC。

2.大对象会优先存放在老年代,目的是减少垃圾回收的成本。实际上大对象存放在老年区是由jvm参数动态决定的。

G1回收器中:

 
  1. -XX:G1HeapRegionSize //设置堆区域的大小

  2. -XX:G1MixedGCLiveThresholdPercent//设置阈值绝对对象直接进入老年代

3.长期存活的对象将进入老年代

一般情况下,对象在刚诞生时会引入Eden区,在经历一次Minor GC后如果仍然可以存活将进入幸存区,并设置对象的年龄为1。对象每熬过一次MinorGC后年龄就增加1。

hotspot将所有对象的年龄从小到大进行排序,并将年龄进行加和,当加到某个对象年龄后,超过幸存区所有对象年龄和的50%时(这个百分比可以自设)。取这个对象的年龄和设置的晋升老年代年龄的阈值取其小的一个作为新的晋升老年代阈值。

设置幸存区晋升老年区阈值:

-XX:MaxTenuringThreshold

设置晋升老年代。幸存区对象年龄超过的百分比

-XX:TargetSurvivorRatio=percent

四、那些对象可以回收?

1.引用计数法

为每个对象分配一个计数器,当有引用时,计数器+1。当引用失效时,计数器-1。当计数器为0时,说明这个对象就是垃圾了。

局限:对象如果循环引用,计数器就永远不是0.

2.可达性分析算法

通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。

哪些对象可以作为 GC Roots 呢?

  • 虚拟机栈(栈帧中的局部变量表)中引用的对象
  • 本地方法栈(Native 方法)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 所有被同步锁持有的对象
  • JNI(Java Native Interface)引用的对象

 被确定为可回收的对象“非死不可”吗?

被判定为垃圾的对象还要经历两次标记才会被回收,第一次标记:可达性算法判定不可达。还有进行一次条件判断和一次筛选。当这个对象没有覆盖finalize 方法,或者已经调用过了finalize 方法时,虚拟机判断没有必要执行finalize 方法。第二次标记:除非待回收的对象和引用链上的对象关联,否则就会被回收。

五、怎么进行回收?(算法)

1.标记清除算法

标记出不需要回收的对象(根据可达性分析),将没有标记的对象进行回收。

问题:标记清除这个过程效率不高;会产生大量的内存碎片。

2.复制算法

将内存分成两块,只使用一半。将使用的一半中保留的对象复制到没使用的那一半。然后清空使用着的这一块。

问题:可用内存空间变小,对于存活对象数量的的老年代不适合(成本高效率低)。

3.标记整理算法

适合老年代,现将对象标记,然后将存活的对象向一端移动,并将界限以外的对象清理掉。

4.分代收集算法:

现代的虚拟机多采用分代收集算法,按照新生代和老年代的特点选择合适的回收算法。例如新生代存在大量的垃圾回收,因此采用复制算法。老年代因为没有额外的内存空间分配担保,采用标记清除算法或者标记整理算法。

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真不当舔狗.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值