Thread in native其实是通过JMI接口去执行了 c和c++的一些native的code,在这种状态下,其实在JMI中已经认为它进入了safepoint,即使已经在运行,与前面提到的stop the world好像理解上有点不一样,这时候这个线程其实还是可以一直在运行的,因为如果这个代码是native的code,其实hotstpot是没法知道是什么状态的,而且也没法控制行为,有可能在做一个很长的 Loop,在那里不停的执行,所以这个时候如果要等的话,肯定会出问题safepoint就进不去了,但这时候认为已经是safepoint了,就可以做那些vm operation,因为我的Java线上还在运行,当 native code执行自己的东西的时候,是不会去碰到那些Java内部的那些hip hop object的那些东西,当想访问那些object的时候,需要通过那些JMI的接口,当调用接口的时候,这个时候JVM就会来检查这时候是不是正在做safepoint,如果正在做safepoint,就会把调用给阻塞,然后线程就会被停下来,等vm operation结束了以后再继续执行下去。 所以虽然在Thread in native状态你仍然在运行,但实际上不会造成造成危害,因为要访问那种Java object或者访问hip的时候,这里的JMI接口会挡住。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。