1).Gc Root
JVM的标记算法我们可以了解为一个可达性算法,所以所有的可达性算法都会有起点,那么这个起点就是GC Root。
也就是需要通过GC Root 找出所有活的对象,那么剩下所有的没有标记的对象就是需要回收的对象。
GC Root 的特点
-
GC Root 在哪里
所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用;换句话说,当前所有正在被调用的方法的引用类型的参数/局部变量/临时值。
- VM的一些静态数据结构里指向GC堆里的对象的引用,例如说HotSpot VM里的Universe里有很多这样的引用。
这里有个问题? 为什么需要将GC root 设置为 所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用?
原因很简单,GC Root 需要确保引用所指的对象都是活着的,而当前线程 frame 中的对象,在这一时刻是存活的。
2).STW(stop the word)
产生fullgc时会触发STW机制,停止掉所有的用户线程让系统进行垃圾回收处理。
停止所有的用户线程,前端的直接体验就是用户感觉到系统突然卡住了。