2. HotSpot VM 模块简述

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,虚拟机核心操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FTC9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值