SEO知识:gc的算法

java常见gc算法有哪些

如题,谁知道呀。


1:标记—清除 Mark-Sweep
过程:标记可回收对象,进行清除
缺点:标记和清除效率低,清除后会产生内存碎片
2:复制算法
过程:将内存划分为相等的两块,将存活的对象复制到另一块内存,把已经使用的内存清理掉
缺点:使用的内存变为了原来的一半
进化:将一块内存按8:1的比例分为一块Eden区(80%)和两块Survivor区(10%)
每次使用Eden和一块Survivor,回收时,将存活的对象一次性复制到另一块Survivor上,如果另一块Survivor空间不足,则使用分配担保机制存入老年代
3:标记—整理 Mark—Compact
过程:所有存活的对象向一端移动,然后清除掉边界以外的内存
4:分代收集算法
过程:将堆分为新生代和老年代,根据区域特点选用不同的收集算法,如果新生代朝生夕死,则采用复制算法,老年代采用标记清除,或标记整理
面试的话说出来这四种足够了

GC是如何是如何启动及GC中的算法等

如题,谁知道呀。


首先,我们先看看GC处理的内存区域在hotSpot(jdk1.8用的这个虚拟机)中是如何划分的.
虚拟机将内存划分为两大区域,新生代与老年代.
而在新生代中
虚拟机又将区域划分为Eden和两块survivor,新创建的对象将会在占有较大区域的Eden和一块survivor,当GC处理垃圾是首先进行标记,会将剩余的存活对象复制之后放在另外survivor中,然后进行清除,清除之会.
那么这里就有一个问题,如果存活对象过多 survivor放不下怎么办?
这里就会使用担保:将溢出的对象放入老年代之中.
如果是老年代那,因为老年代的对象的存活能力很强,且无法有空间为老年代进行担保,所以老年代使用的事 标记-整理
算法进行垃圾回收的,当GC标记清除了可回收的对象,会将剩余对象向一端移动.
那么GC是如何一步步的进行垃圾回收的那?
首先GC要启动可达性算法,那么GC是如何快速的找出所有的GCROOTS节点的那?
1. hotSpot是使用OopMap这样一组数据结构进行记录的,类加载完成之后
会记录对象内什么偏移量是什么类型(书上的话),编译器也会记录栈和寄存机中的位置.,而这个数据会在特点的位置进行记录,这些位置就叫做安全点(safepoint).
还有 GC的启动需要暂时挂起所有的线程,那么GC是在什么时间进行垃圾回收的那?
1.当线程运行到safepoint的时候才会进行GC,那么GC开始之后需要挂起所有线程,这是GC会选择使用主动式的抢断,也就是说GC会设置一个和安全点重合的轮询点,让所有线程都去访问这个轮询点,如果线程访问结果为真,那么就代表线程到了轮询点,便会记性线程中断了.

文章发布时间与标签:

更新时间:2020-12-04 21:44:40
标签:

推荐的SEO知识: