首先要知道Java的信任状态,Java最主要信任状态是“Thread in Java”状态,这个状态里面在执行一个解释器或者已经编译的方法,纯Java执行。这时候如果发生Safepoint,会通过Interpreter机制把这个线程直接挂起,暂停下来,然后去Safepoint里面进行GC的各种操作。 在Java里面,调用JNI进入Native,会切换到Thread in native状态,这里执行Native函数,在执行的时候跟GC可以并行执行,因为理论上要么执行,要么通过JNI和JNI交互,所有的跟JNI相关的数据结构都可以被管理。然后Native还可以去切换到JVM状态,这是非常关键的状态,这个状态不能发生GC,不用关心。 JNI与Safepoint交互,假如JNI执行时发生Safepoint能并行。JNI执行的时候返回Java,这时候会被阻塞,需要检查状态,卡在Safepoint状态,直到Safepoint结束,继续回到Java。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。