Hotspot虚拟机在特定位置记录OopMap,这些位置被称为安全点(Safepoint)。
安全区域是指能够确保在某一段代码片段之中,引用关系不会发生变化,因此,在这个区域中任 意地方开始垃圾收集都是安全的。我们也可以把安全区域看作被扩展拉伸了的安全点。
首先,我们先看看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会设置一个和安全点重合的轮询点,让所有线程都去访问这个轮询点,如果线程访问结果为真,那么就代表线程到了轮询点,便会记性线程中断了.。