上QQ阅读APP看书,第一时间看更新
2.5.3 本地线程进入安全点
如果线程正在执行本地代码(Native Code,如C/C++代码),本地代码访问的内存空间和Java堆空间不是一个,这意味着本地代码不能直接访问Java对象[1]。理论上本地线程不需要暂停。
但是可能存在这样的情况:GC开始执行,本地线程也在并发执行,突然本地线程执行完毕切换到Java线程执行Java代码。对于这种情况,GC已经发生,但是线程尚未暂停,如何设计合理的机制暂停线程?如果不暂停,线程可能改变对象的引用关系,进而引发GC的正确性问题。
对于这种情况,一个解决方案是:当线程从本地代码执行结束切换到Java代码执行时,让线程暂停执行。当然,JVM中关于Java代码和本地代码的切换设计得相当复杂,这里不做介绍,只介绍在互操作时确保GC的正确性。如果需要了解与互操作相关的更详细的信息,可以参考其他书籍[2]。