hotspot/src/share/vm/prims/jni.cpp
この書き換え処理は VM Operation 中で実行するが, ネイティブメソッドを実行中のスレッドは停止しないので 念のため関数ポインタはアトミックに書き換えておく.
// For jvmti use to modify jni function table.
// Java threads in native contiues to run until it is transitioned
// to VM at safepoint. Before the transition or before it is blocked
// for safepoint it may access jni function table. VM could crash if
// any java thread access the jni function table in the middle of memcpy.
// To avoid this each function pointers are copied automically.
void copy_jni_function_table(const struct JNINativeInterface_ *new_jni_NativeInterface) {
  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}
      assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}
      intptr_t *a = (intptr_t *) jni_functions();
      intptr_t *b = (intptr_t *) new_jni_NativeInterface;
  {- -------------------------------------------
  (1) new_jni_NativeInterface 引数で指定された内容で
      JNI Function table を上書きする.
      (なお, 各関数ポインタは Atomic::store_ptr() でアトミックに書き込む)
      ---------------------------------------- -}
      for (uint i=0; i <  sizeof(struct JNINativeInterface_)/sizeof(void *); i++) {
        Atomic::store_ptr(*b++, a++);
      }
    }
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.