java 垃圾回收机制

Java垃圾回收主要完成:

(1)跟踪并监控每个Java对象,当某个对象处于不可达状态时,回收该对象所占内存空间

(2)清理内存分配,回收过程中产生的内存碎片


垃圾回收的基本算法:

(1)串行回收和并行回收:串行回收只用一个CPU来执行垃圾回收操作,并行回收是把整个回收工作拆分成多部分,每个部分由一个

CPU负责,从而让多个CPU并行回收(并行回收效率高,复杂度也高,内存碎片会增加)

(2)并发执行(concurrent)和应用程序停止(stop-the-world):应用程序停止的方式在执行垃圾回收同时导致应用程序的暂停,并发执行的垃圾

回收不会暂停应用程序,需解决一些冲突,因此开销更高,需要更多的堆内存

(3)压缩和不压缩:支持压缩的垃圾回收器把所有对象搬迁到一起,然后将之前占用的内存全部回收,不压缩的垃圾回收只是

回收内存,这样收回来的内存不可能是连续的。复制式的垃圾回收将所有可达对象复制到另一块相同的内存中,这样不会产生内存碎片,但需

复制数据和额外的内存


复制:将堆内存分为两个相同空间,从根开始访问每一个关联的可达对象,将空间A的可达对象全部复制到空间B,然后一次性回收整个空间A

(复制数据、额外内存)

标记清除:不压缩的回收方式,从根开始访问所有可达对象,将他们标记为可达,然后再遍历一次整个内存区域,把没有标记为可达的对象进行回收处理

(两次遍历)

标记压缩:压缩方式,充分利用上述两种算法的优点,从根开始访问所有可达对象,标记为可达状态,接下来垃圾回收器

将这些活动对象搬迁到一起,这个过程也被称为内存压缩,然后垃圾回收机制再次回收不可达对象所占用的内存空间


现代的垃圾回收器用分代的方式

分代的基本思路是根据对象生存时间的长短,把堆内存分为3个代:Young(年轻代)、old(老年代)、permanent(永久代)

垃圾回收器根据不同代的特点采用不同的回收算法,从而充分利用各种回收算法的优点。

分代回收策略基于如下事实:

(1)绝大多数对象不会被长时间引用,这些对象在其young期间就会被回收

(2)很老的对象和很新的对象之间很少存在相互引用的情况


Young代

young代的对象,大部分很快就进入不可达的状态,只有少量的对象能熬到垃圾回收执行时,而垃圾回收机制只需保留young代

中处于可达状态的对象,因此young代都采用复制算法(只需遍历那些处于可达状态的对象)


Old代

old代垃圾回收的执行频率无需太高,因为很少对象会死掉

每次对old代执行垃圾回收需要更长的时间来完成

基于以上考虑,old代的垃圾通常使用标记压缩算法


permanent代

通常用于转载class,方法等信息,垃圾回收机制通常不会回收permanent代中的对象




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值