hotspot模块简介
└── cpu
└── os
└── os_cpu
└── share
└── tools
└── vm HotSpot VM的核心代码
├── adlc 平台描述文件(上面的cpu或os_cpu里的*.ad文件)的编译器
├── asm 汇编器接口
├── c1 client编译器(又称“C1”)
├── ci 动态编译器的公共服务/从动态编译器到VM的接口
├── classfile 类文件的处理(包括类加载和系统符号表等)
├── code 动态生成的代码的管理
├── compiler 从VM调用动态编译器的接口
├── gc_implementation GC的实现
│ ├── concurrentMarkSweep
│ ├── g1
│ ├── parallelScavenge
│ ├── parNew
│ └── shared GC的通用实现
├── gc_interface GC接口_statk
├── interpreter 解释器,包括“模板解释器”(官方版在用)和“C++解释器”(官方版不在用)
├── libadt 一些抽象数据结构
├── memory 内存管理相关(老的分代式GC框架也在这里)
├── oops HotSpot VM的对象系统的实现
├── opto server编译器(又称“C2”或“Opto”)
├── precompiled
├── prims HotSpot VM的对外接口,包括部分标准库的native部分和JVMTI实现
├── runtime 运行时支持库(包括线程管理、编译器调度、锁、反射等)
├── services 主要是用来支持JMX之类的管理功能的接口
├── shark 基于LLVM的JIT编译器(官方版里没有使用)
├── trace
└── utilities 一些基本的工具类
hotspot所处的位置
模块说明
Prims模块
主要负责提供外部程序访问JVM内部信息的对外接口,包括JNI、JVM、JVMTI和Perf。
JNI子模块
JNI——Java Native Interface。
为什么需要JNI?
Java源码被编译为字节码,是一种符合JVM规范能够被识别及运行的高度优化指令,屏蔽了与底层操作系统和物理硬件运行的一些特性。
如果希望去访问底层操作系统和物理硬件资源,就需要JNI技术让Java代码和使用其他编程语言代码进行交互。
hotspot中以"jni_"开头的函数都是由C/C++编写的本地代码,用于让Java调用JVM中的本地库函数。
jni.h示例
struct JNIEnv_ {
const struct JNINativeInterface_ *functions;
jclass DefineClass(const char *name, jobject loader, const jbyte *buf,
jsize len) {
return functions->DefineClass(this, name, loader, buf, len);
}
jclass FindClass(const char *name) {
return functions->FindClass(this, name);
}
jobject CallObjectMethodV(jobject obj, jmethodID methodID,
va_list args) {
return functions->CallObjectMethodV(this,obj,methodID,args);
}
jint CallIntMethod(jobject obj, jmethodID methodID, ...) {
va_list args;
jint result;
va_start(args,methodID);
result = functions->CallIntMethodV(this,obj,methodID,args);
va_end(args);
return result;
}
};
struct JavaVM_ {
const struct JNIInvokeInterface_ *functions;
jint DestroyJavaVM() {
return functions->DestroyJavaVM(this);
}
};
JVM模块
JVM模块在JNI模块进行了扩充,JVM模块所包含的本地方法全都是与JVM相关的底层函数,以“JVM_”开头的函数全都是由本地代码实现的Java API。
大部分Java API都需要调用本地代码去实现,如:java.lang.Object java.lang.String java.lang.System Thread IO等。
jvm.h示例
/*************************************************************************
PART 1: Functions for Native Libraries
************************************************************************/
/*
* java.lang.Object
*/
JNIEXPORT jint JNICALL
JVM_IHashCode(JNIEnv *env, jobject obj);
JNIEXPORT void JNICALL
JVM_MonitorWait(JNIEnv *env, jobject obj, jlong ms);
/*
* java.lang.String
*/
JNIEXPORT jstring JNICALL
JVM_InternString(JNIEnv *env, jstring str);
/*
* java.lang.Thread
*/
JNIEXPORT void JNICALL
JVM_StartThread(JNIEnv *env, jobject thread);
/*
* java.lang.Class and java.lang.ClassLoader
*/
/*
* Returns the class in which the code invoking the native method
* belongs.
*
* Note that in JDK 1.1, native methods did not create a frame.
* In 1.2, they do. Therefore native methods like Class.forName
* can no longer look at the current frame for the caller class.
*/
JNIEXPORT jclass JNICALL
JVM_GetCallerClass(JNIEnv *env, int n);
JVMTI子模块
JVMTI——Java Virtual Machine Tool Interface,JVM工具接口。用于取代JVMPI(Profiling Interface剖析接口)和(Debugging Interface调试接口)。
可以通过JVMTI创建代理程序Agent对Java程序进行监视和控制,包括内存使用率、CPU使用率和线程分析等。
Agent可以向运行中的JVM订阅感兴趣的事件,同时JVMTI提供了查询和控制Java程序运行状态的函数。
Perf子模块
是jdk.internal.perf.Perf底层实现,函数名以“PERF_”开头,用于监控JVM内部的Perf Data计数器。
Runtime模块
包含如下子模块:
- Thread子模块
- Arguments子模块,标记和传递JVM参数选项
- StubRoutines、StubCodeGenerator子模块
- Frame子模块,表示物理栈帧
- CompilationPolicy,匹配编译策略
- Init,os初始化
- VMThread,创建其他线程
- VMOperation,虚拟机核心操作