Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JVM为同一个类发送多个JVMTI类加载事件?_Java_Jvm_Classloader_Jvmti - Fatal编程技术网

Java 为什么JVM为同一个类发送多个JVMTI类加载事件?

Java 为什么JVM为同一个类发送多个JVMTI类加载事件?,java,jvm,classloader,jvmti,Java,Jvm,Classloader,Jvmti,我启用了JVMTI类加载事件,这些事件应该在第一次加载类时生成。我希望每个加载的类都能准确地获得此事件一次,但对于某些类,它似乎会生成多次,例如,我得到两次此事件: ClassLoad: Ljava/util/concurrent/ThreadFactory; loaded by thread 1 ClassLoad: Ljava/util/concurrent/ThreadFactory; loaded by thread 1 在systemDictionary.cpp中,我发现发生了三次J

我启用了JVMTI类加载事件,这些事件应该在第一次加载类时生成。我希望每个加载的类都能准确地获得此事件一次,但对于某些类,它似乎会生成多次,例如,我得到两次此事件:

ClassLoad: Ljava/util/concurrent/ThreadFactory; loaded by thread 1
ClassLoad: Ljava/util/concurrent/ThreadFactory; loaded by thread 1
systemDictionary.cpp
中,我发现发生了三次
JvmtiExport::post_class_load
,我认为这是负责执行回调的代码(如果有)。他们在

  • SystemDictionary::解析\u实例\u类\u或\u null
  • SystemDictionary::解析流
  • SystemDictionary::define\u instance\u class
  • 但我还不了解整个流程,因此不清楚为什么我会多次获得该活动


    我能做些什么来防止这种情况发生,或者我需要自己处理,并调整代码以忽略同一类的多个事件吗?

    可以看到两次事件。这意味着类解析在不同类装入器的上下文中发生两次。首先,它由引导类装入器解析,然后由系统类装入器-
    sun.misc.Launcher.AppClassLoader
    解析

    来自的实用程序将阐明此类事件发生时的情况

    考虑一个简单的例子:

    public class Test {
    
        public void setThreadFactory(ThreadFactory factory) {
        }
    
        public static void main(String[] args) {
        }
    }
    
    当启动器查找
    publicstaticvoidmain()
    时,它会为公共方法创建
    Method
    对象,这会导致解析此类方法签名中的所有类

    第一个ClassLoad事件:

    Class loaded: java/util/concurrent/ThreadFactory
      - ClassLoad(_jvmtiEnv*, JNIEnv_*, _jobject*, _jclass*) + 0x69
      - JvmtiExport::post_class_load(JavaThread*, Klass*) + 0x15b
      - SystemDictionary::define_instance_class(instanceKlassHandle, Thread*) + 0x3cc
      - SystemDictionary::find_or_define_instance_class(Symbol*, Handle, instanceKlassHandle, Thread*) + 0x35d
      - SystemDictionary::load_instance_class(Symbol*, Handle, Thread*) + 0x20c
      - SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*) + 0x78c
      - JVM_FindClassFromBootLoader + 0x22b
      - Java_java_lang_ClassLoader_findBootstrapClass + 0x9b
      * java/lang/ClassLoader.findBootstrapClass @ -1
      * java/lang/ClassLoader.findBootstrapClassOrNull @ 12
      * java/lang/ClassLoader.loadClass @ 48
      * java/lang/ClassLoader.loadClass @ 38
      * sun/misc/Launcher$AppClassLoader.loadClass @ 81
      * java/lang/ClassLoader.loadClass @ 3
      * java/lang/Class.getDeclaredMethods0 @ -1
      * java/lang/Class.privateGetDeclaredMethods @ 37
      * java/lang/Class.privateGetMethodRecursive @ 2
      * java/lang/Class.getMethod0 @ 16
      * java/lang/Class.getMethod @ 13
      * sun/launcher/LauncherHelper.validateMainClass @ 12
      * sun/launcher/LauncherHelper.checkAndLoadMain @ 214
    
    第二条:

    Class loaded: java/util/concurrent/ThreadFactory
      - ClassLoad(_jvmtiEnv*, JNIEnv_*, _jobject*, _jclass*) + 0x69
      - JvmtiExport::post_class_load(JavaThread*, Klass*) + 0x15b
      - SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*) + 0x87c
      - SystemDictionary::resolve_or_fail(Symbol*, Handle, Handle, bool, Thread*) + 0x33
      - get_mirror_from_signature(methodHandle, SignatureStream*, Thread*) + 0xc6
      - Reflection::get_parameter_types(methodHandle, int, oopDesc**, Thread*) + 0x18e
      - Reflection::new_method(methodHandle, bool, bool, Thread*) + 0xfc
      - get_class_declared_methods_helper(JNIEnv_*, _jclass*, unsigned char, bool, Klass*, Thread*) + 0x479
      - JVM_GetClassDeclaredMethods + 0xcb
      * java/lang/Class.getDeclaredMethods0 @ -1
      * java/lang/Class.privateGetDeclaredMethods @ 37
      * java/lang/Class.privateGetMethodRecursive @ 2
      * java/lang/Class.getMethod0 @ 16
      * java/lang/Class.getMethod @ 13
      * sun/launcher/LauncherHelper.validateMainClass @ 12
      * sun/launcher/LauncherHelper.checkAndLoadMain @ 214