代码之家  ›  专栏  ›  技术社区  ›  Gilgamesz

JNI代码IE与垃圾收集同时执行。

  •  2
  • Gilgamesz  · 技术社区  · 6 年前

    它写在 http://psy-lob-saw.blogspot.com/2015/12/safepoints.html

    Java线程在执行JNI代码时处于安全点。以前 跨越本机调用边界,堆栈保持一致 在移交给本机代码之前状态。这意味着 线程仍可以在安全点运行。

    怎么可能?毕竟,我可以将对象的引用传递给 JNI . 在JNI中,我可以在该对象中设置字段。

    很明显,它不能被收集(我们有一个本地参考)。但是,它可以在完全GC收集期间通过GC移到旧一代。 因此,我们有以下情况:

    GC collector:                          | Thread executing JNI code
    compact old generation                 | modify object fields that can be 
    and move object from young generation  | moved now! A catastrophe. 
    to old generation.                     |
    

    JVM是如何处理的?

    1 回复  |  直到 6 年前
        1
  •  4
  •   apangin    6 年前

    in_native in_vm

    ThreadStateTransition::transition_from_native() JavaThread::check_safepoint_and_suspend_for_native_trans(thread)

    // Slow path when the native==>VM/Java barriers detect a safepoint is in
    // progress or when _suspend_flags is non-zero.
    // Current thread needs to self-suspend if there is a suspend request and/or
    // block if a safepoint is in progress.