四、有哪些垃圾回收的算法?
1、复制算法(copying):将JVM堆内存中的可用内存划分为大小相等的两块空间,每次只使用其中的一块。当这一块内存使用达到饱和,就进行Minor GC,将存活的内存复制到另一块上面,然后再把已经使用过的内存空间一次性清理掉。这样每次都是对整个半区进行回收。特点:运行效率较高,不会产生内存碎片;缺点是消耗内存,实际可用内存只有一半,代价较高。
2、标记-整理(Mark-Compact):第一步利用可达性算法去遍历内存中的对象,把存活的对象和垃圾对象进行标记;第二步将所有存活的对象向一块区域移动,然后将此区域外的内存全部回收。特点:无碎片空间产生;缺点是执行效率相对较慢。
3、标记-清除(Mark-and-Sweep):第一步利用可达性算法遍历内存,将存活的对象和死亡对象分别进行标记;第二步再次遍历,将死亡对象回收掉。特点:标记和清除的效率都不太行;且标记清除后往往会产生大量的不连续的空间分片,可能会导致之后程序运行的时候需要分配大对象而找不到连续分片而不得不触发一次GC。
4、分代收集(Generational):将Java堆分为新生代和老年代,这样我们就可以根据各个年代的特点使用适当的回收算法。新生代有更高的回收频率,可以采用复制算法快速回收生命周期短的对象;长期存活的对象就进入老年代,老年代的垃圾回收效率可以相对低一些可以采用标记-整理或者标记清除进行回收。缺点是对长寿的对象,如果频繁的进行内存拷贝,效率会比较低。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_40413725/article/details/136758344
https://blog.csdn.net/u013651026/article/details/130347050
GC Roots 到底是什么东西呢,哪些对象可以作为 GC Root 呢?
-
虚拟机栈(栈帧中的本地变量表)中引用的对象
-
本地方法栈中 JNI(即一般说的 Native 方法)引用的对象
-
方法区中类静态属性引用的对象
-
方法区中常量引用的对象
便于记忆,称他为两栈两方法!下面我们一一介绍一下: