GC笔记--Native线程 / Native code和GC-safe point的关系

Native code,比如说c++的代码,不会直接和JS运行时打交道,运行的都是c++自己的代码。

所以,只要Native code正在运行c++自己的代码,这段线程就是和虚拟机无关的,两个可以不相互干涉。

但是native code可以调用JS/JAVA的栈,通过native的JS接口或者JNI接口。这时候,就会调用到JS/JAVA的栈中去,进入虚拟机管理的范畴。

 

所以只要native没有调用JS/JAVA栈(如JNI接口),那么整个native线程是GC安全区域(GC safe region),GC发生时native线程可以继续执行。

 

但是,一旦Native线程调用VM接口,Native线程就需要切换状态,切换成非GC安全。

比如调用Java的JNI接口,Native线程首先尝试切换成Runable态。

切换时,检查是否已发生GC。如果已经在GC,等待GC完成(不然接着运行就危险了,因为对象移动等);如果没有GC,成功切换为Runable态,阻塞GC的进行,然后运行自己的 JAVA栈。

当调用结束时,Native线程从Runable态切换回Native态,回到GC安全点。

 

所以Native线程(非VM接口调用状态),不响应GC,不被GC阻塞。

NatIve线程进入VM接口调用,则与GC互相阻塞。

 

总结:

只要Native code没有进入虚拟机(JS/JAVA)栈,那么这段线程就是安全的,在safe region,不用管虚拟机,虚拟机也不用管它。

但是一旦切换到虚拟机栈,就会进行safe point、GC的检查。

posted @ 2017-03-22 11:32  xuyv  阅读(322)  评论(0编辑  收藏  举报