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

作者: 励志做一名老中医 | 来源:发表于2018-05-12 15:10 被阅读9次

首先,我们先看看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会设置一个和安全点重合的轮询点,让所有线程都去访问这个轮询点,如果线程访问结果为真,那么就代表线程到了轮询点,便会记性线程中断了.

相关文章

网友评论

    本文标题:GC是如何是如何启动及GC中的算法等

    本文链接:https://www.haomeiwen.com/subject/enzcdftx.html