Gil*_*esz 4 garbage-collection jvm
引用来自:http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html
安全点状态检查本身以非常狡猾的方式实现.正常的内存变量检查需要昂贵的内存屏障.但是,安全点检查是在内存读取障碍时实现的.然后需要安全点,JVM取消映射页面,该地址在应用程序线程上引发页面错误(由JVM的处理程序处理).这样,HotSpot维护其JITed代码CPU管道友好,但确保正确的内存语义(页面取消映射强制内存屏障处理核心).
我有些疑惑:
操作系统首先处理页面错误.如果此故障的原因是应用程序尝试非法内存访问,则OS会将适当的信号传递给应用程序,通常是SIGSEGV.
默认情况下,SIGSEGV会终止应用程序.但是,应用程序可能会安装自己的信号处理程序.这就是JVM的作用.它接收SIGSEGV,如果它发现信号是由安全点轮询指令引起的,JVM会挂起当前线程,直到安全点操作结束.
进程可以通过调用取消映射页面munmap()
.但在这种特殊情况下,JVM不会取消映射页面,而是通过mprotect()
使用PROT_NONE 调用来更改其保护状态.