Java虚拟机(JVM)04 When and How to do 垃圾回收 算法

用标记计数法和可达性探测法对堆中的对象进行标记后,怎么去回收垃圾对象以及何时去回收呢?这用到了几种算法:

标记–清除法:就是将之前标记完成的对象进行简单的删除操作,这样会产生不整齐的内存。


标记–复制法:先将Java堆的内存区域分成两个部分,其中一个用来存放Java对象,另一个是空的。当进行垃圾回收的时候,在有存放的地方先将标记的对象清除,没有清除的对象进行复制,转移到另一半空内存中。垃圾回收工作过的这个内存全部设置为0。等作为下一次的空内存区。


标记–复制的优化:Java堆中有新生代,老生代之分。一般新创建的Java对象放在新生代中,老生代中存放存活时间较长的对象。新生代中的对象随着时间进入老生代中。垃圾回收主要集中在新生代这块区域上。
新生代:Eden(80%),survival(10%)这个是两块,共计20%。
新生的Java对象放在Eden中,经过垃圾回收剩下的对象放在survival中。每次垃圾回收在Eden和一块survival上,把这两块内存中的剩下的对象放入另一个survival中,如此。当一块survival的大小已经不够的时候,一般就将这次对象放在老生代中。


标记–整理算法:跟标记–清除算法不一样的是这个是清除完成后把剩下的对象移到内存的一侧。形成一个整齐的内存空间,解决了空间碎片化的问题,但是很耗时间。

发布了9 篇原创文章 · 获赞 0 · 访问量 63
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览