如何查找JNI_CreateJavaVM函数的JDK源码?
JNI_CreateJavaVM 在 HotSpot 中的定位及字节码解析逻辑
一、JNI_CreateJavaVM 的定义位置
在 HotSpot 源码里,这个函数的入口根据平台不同分布在对应的 jni.cpp 文件中:
- Unix/Linux/macOS 平台:
src/share/vm/prims/jni.cpp,函数直接以JNI_CreateJavaVM命名,内部会调用Threads::create_vm完成虚拟机的真正初始化。 - Windows 平台:
src/windows/prims/jni.cpp,逻辑和 Unix 平台类似,最终也会转发到核心初始化逻辑。
如果在 GitHub 搜不到,建议直接按文件名 jni.cpp 筛选对应 JDK 版本的分支(比如 jdk8u、jdk11u),比搜函数名更靠谱——部分平台可能会用宏对函数做包装,直接搜函数名容易漏。
二、JNI_CreateJavaVM 和字节码解析的关系
JNI_CreateJavaVM 本身不负责字节码解析,它的核心工作是启动并初始化整个 JVM 实例:包括初始化堆、方法区等内存区域,加载核心类库(比如 java.lang.Object),启动主线程等。字节码解析是 JVM 初始化完成后,类加载时的工作:
- 当通过
JNIEnv调用 Java 方法或加载类时,类加载器会读取.class文件的字节流。 - 字节码解析的核心逻辑在
src/share/vm/classfile/classFileParser.cpp里,ClassFileParser类负责解析字节码的常量池、类结构、方法表等内容,把字节码转换成 HotSpot 内部的InstanceKlass数据结构。 - 解析完成后,字节码会被交给解释器或即时编译器处理:解释器入口在
src/share/vm/interpreter/interpreter.cpp,C1、C2 即时编译器则分别在src/share/vm/c1和src/share/vm/c2目录下。
三、快速找核心代码的小技巧
- 从
JNI_CreateJavaVM跟踪到Threads::create_vm,顺着初始化流程能找到类加载器的初始化逻辑,进而关联到字节码解析模块。 - 直接搜
ClassFileParser相关类和方法,能跳过初始化流程,直接定位字节码解析的核心实现。
内容的提问来源于stack exchange,提问作者stavratum
相关产品推荐
相关产品推荐

