博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM(4)--垃圾回收算法
阅读量:5128 次
发布时间:2019-06-13

本文共 646 字,大约阅读时间需要 2 分钟。

1、标记清除法

顾名思义,算法分为标记和清除两个阶段,首先标记处需要回收的对象,在标记完成后统一回收。

缺点是标记和清除效率都比较低,而且容易产生大量不连续碎片内存。导致在分配较大对象时无法找到足够的空间,使得触发另一次标记清除。

原书图示如下:

 

2、复制算法

将内存分为两块,每块占50%,当其中一块内存用完,就把所有存活对象复制到另一块内存,再清理掉原本的已使用空间。

此算法不用考虑内存碎片的问题,只要移动堆顶指针,按照顺序分配内存就行,实现简单,运行高效。

缺点是将内存一分为二,代价太大。

现在的商业虚拟机大多都使用了这个方法,研究发现,98%的对象会在第一次回收就被清理掉,所以不必按照50%划分,一般会默认建立8:1:1的Eden区和两个Survivor区,每次清理一个Eden区一个Survivor区的内容,复制到另一Survivor中。当Survivor内存也不够时,还可以依赖老年代。

图示如下:

 

 3、标记整理算法

一般用于老年代。

复制算法需要对额外空间进行依赖来复制,为了解决这个问题,可以标记所以存活对象,向一端移动,再清理其他所有内存。

图示如下:

 

4、分代收集算法

把JVM中的堆分成新生代和老生代,在新生代中因为每次都有大量死去,所以选择复制算法,每次只要付出复制少量存活对象的成本就行。

在老生代中,因为对象存活率高,所以一般使用标记清楚或者标记整理。

 

转载于:https://www.cnblogs.com/blogofjzq/p/9407201.html

你可能感兴趣的文章
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
[HDU3683 Gomoku]
查看>>
下一代操作系统与软件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Python IO模型
查看>>
DataGridView的行的字体颜色变化
查看>>
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Android-多线程AsyncTask
查看>>
LeetCode【709. 转换成小写字母】
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>