性能问答>关于垃圾回收>
3回复
7月前

关于垃圾回收



jvm的在进行回收的时候,怎么实现安全点的?怎么坚测到是安全点的

760 阅读
请先登录,再评论

我也很想知道,期待大神们给答案

27月前
回复 鲤鱼001:

实现安全点有几种方式:
(1)处于解释执行字节码的状态中,解释器在通过字节码派发表(dispatch table)获取到下一条字节码的时候会主动检查安全点的状态;
(2)处于执行native代码的状态,也就是执行JNI,此时,VMThread不会等待线程进入安全点,执行JNI退出后线程需要主动检查安全点状态,如果此时安全点位置被标记了,那么就不能继续执行,需要等待安全点位置被清除后才能继续执行;
(3)处于编译代码执行中,那么编译器会在合适的位置(比如循环、方法调用等)插入读取全局Safepoint Polling内存页的指令,如果此时安全点位置被标记了,那么Safepoint Polling内存页会变成不可读,此时线程会因为读取了不可读的内存也而陷入内核,事先注册好的信号处理程序就会处理这个信号并让线程进入安全点。
(4)线程本身处于blocked状态,比如线程在等待锁,那么线程的阻塞状态将不会结束直到安全点标志被清除掉;
(5)当线程处于(1)/(2)/(3)三种状态的切换中,那么切换前会先检查安全点的状态,如果此时要求进入安全点,那么切换将不被允许,需要等待直到安全点状态清除;

如果要查看安全点进入的详细,可使用相关虚拟机命令参数打印即可,

7月前回复
回复 鲤鱼001:

是不是很内核机制有关

7月前回复