openjdk-jdk8-b109 hotspot虚拟机启动过程分析_1

1、HotSpot And OpenJDK And OracleJDK And JER区别 学习java前我们先了解下这几个词的区别,HotSpot、JDK、JRE、OpenJDK、Oracle JDK 一、HotSpot HotSpot是JVM(Java Virtual Machine),是一个运行Java字节码的虚拟机,具有语言无关性和平台无关性。平台无关性:我们java编写的程序可以运行在window、mac、Linux上就是HotSpot的平台无关性。 语言无关性:比如Java、kotlin、Scala、Clojure、Groovy、Jython、JRuby、Ceylon、Eta、Ha 阅读详情

基于OpenJdk 标签 jdk8-b109版本分析

HotSpot是由Oracle开发的Java虚拟机(JVM)的一种实现,也是使用最广泛的JVM之一。

找到hotspot虚拟机入口

        完成编译配置后,会在根目录生成Makefile文件,如何编译jdk8  Windows平台编译Jdk8

Makefile 中找到了 Main.gmk,构建入口由此开始。

ifeq ($(words $(SPEC)),1)
    # We are building a single configuration. This is the normal case. Execute the Main.gmk file.
    include $(root_dir)/make/Main.gmk
  else

根目录/make/Main.gmk,这里可以看到构建目标 :jdk,具体构建过程在 BuildJdk.gmk文件。

jdk: langtools hotspot corba jaxp jaxws jdk-only
jdk-only: start-make
	@$(call TargetEnter)
	@($(CD) $(JDK_TOPDIR)/make && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk $(JDK_TARGET))
	@$(call TargetExit)

根目录/jdk/make/BuildJdk.gmk,jvm启动器由构建目标 launchers 实现,由  CompileLaunchers.gmk 提供构建过程。

launchers: libs launchers-only
launchers-only:
        # Finally compile the launchers.
	+$(MAKE) -f CompileLaunchers.gmk

最终定位到hotspot入口  根目录/jdk/src/share/bin/main.c

  $(call SetupNativeCompilation,BUILD_LAUNCHER_$1, \
      SRC := $(JDK_TOPDIR)/src/share/bin, \
      INCLUDE_FILES := main.c, \
      LANG := C, \

进入jvm前-参数预处理

jdk/src/share/bin/main.c

main 并没有太多复杂的操作,它对程序参数解析并生成后续jvm可用的参数集合,然后调用 

JLI_Launch 进一步处理。

    return JLI_Launch(margc, margv,
                   sizeof(const_jargs) / sizeof(char *), const_jargs,
                   sizeof(const_appclasspath) / sizeof(char *), const_appclasspath,
                   FULL_VERSION,
                   DOT_VERSION,
                   (const_progname != NULL) ? const_progname : *margv,
                   (const_launcher != NULL) ? const_launcher : *margv,
                   (const_jargs != NULL) ? JNI_TRUE : JNI_FALSE,
                   const_cpwildcard, const_javaw, const_ergo_class);

JLI_Launch

jdk/src/share/bin/java.c

方法定义及参数描述清晰明了这里不再赘述。

/*
 * Entry point.
 */
int
JLI_Launch(int argc, char ** argv,              /* main argc, argc */
        int jargc, const char** jargv,          /* java args */
        int appclassc, const char** appclassv,  /* app classpath */
        const char* fullversion,                /* full version defined */
        const char* dotversion,                 /* dot version defined */
        const char* pname,                      /* program name */
        const char* lname,                      /* launcher name */
        jboolean javaargs,                      /* JAVA_ARGS */
        jboolean cpwildcard,                    /* classpath wildcard*/
        jboolean javaw,                         /* windows-only javaw */
        jint ergo                               /* ergonomics class policy */
)
//设置跟踪调试标识
InitLauncher(javaw);

//如果启用了跟踪标识则输出启动参数
if (JLI_IsTraceLauncher()) {
        int i;
        printf("Command line args:\n");
        for (i = 0; i < argc ; i++) {
            printf("argv[%d] = %s\n", i, argv[i]);
        }
        AddOption("-Dsun.java.launcher.diag=true", NULL);
    }

选择JRE,并解析jvm参数、确认jre可使用。

JLI_Launch->SelectVersion->LocateJRE->ExecJRE

SelectVersion

    //保存jre版本信息
    if (version != NULL)
        info.jre_version = version;
    if (restrict_search != -1)
        info.jre_restrict_search = restrict_search;

    //入口类从命令行传入
    if (info.main_class != NULL)
        *main_class = JLI_StringDup(info.main_class);

    //没有jre版本信息,后续代码无法定位jre路径和进行版本检查
    if (info.jre_version == NULL) {
        JLI_FreeManifest();
        JLI_MemFree(new_argv);
        return;
    }

  //jre版本信息格式是否正确
    if (!JLI_ValidVersionString(info.jre_version)) {
        JLI_ReportErrorMessage(SPC_ERROR1, info.jre_version);
        exit(1);
    }

加载jre路径信息
jre = LocateJRE(&info);

//检查jre是否可使用,它会尝试启动jre并结束jre进程。
ExecJRE(jre, new_argv);

ExecJRE

//尝试启动jre        
if (!CreateProcess((LPCTSTR)path,       /* executable name */
          (LPTSTR)cmdline,                      /* command line */
          (LPSECURITY_ATTRIBUTES)NULL,          /* process security attr. */
          (LPSECURITY_ATTRIBUTES)NULL,          /* thread security attr. */
          (BOOL)TRUE,                           /* inherits system handles */
          (DWORD)0,                             /* creation flags */
          (LPVOID)NULL,                         /* environment block */
          (LPCTSTR)NULL,                        /* current directory */
          (LPSTARTUPINFO)&si,                   /* (in) startup information */
          (LPPROCESS_INFORMATION)&pi)) {        /* (out) process information */
            JLI_ReportErrorMessageSys(SYS_ERROR1, path);
            exit(1);
        }

        if (WaitForSingleObject(pi.hProcess, INFINITE) != WAIT_FAILED) {
            if (GetExitCodeProcess(pi.hProcess, &exitCode) == FALSE)
                exitCode = 1;
        } else {
            JLI_ReportErrorMessage(SYS_ERROR2);
            exitCode = 1;
        }

        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);

 CreateExecutionEnvironment 

识别32位和64位模式

检查虚拟机特性

配置jvm路径 (jvm.dll)

    CreateExecutionEnvironment(&argc, &argv,
                               jrepath, sizeof(jrepath),
                               jvmpath, sizeof(jvmpath),
                               jvmcfg,  sizeof(jvmcfg));

 加载 jvm dll文件(jvm实现在dll文件中)

    if (!LoadJavaVM(jvmpath, &ifn)) {
        return(6);
    }

 加载特定版本的vcrt运行库

加载jvm.dll

获取 CreateJavaVM函数指针,jvm初始化入口在 CreateJavaVM

    LoadMSVCRT();

    /* Load the Java VM DLL */
    if ((handle = LoadLibrary(jvmpath)) == 0) {
        JLI_ReportErrorMessage(DLL_ERROR4, (char *)jvmpath);
        return JNI_FALSE;
    }

    /* Now get the function addresses */
    ifn->CreateJavaVM =
        (void *)GetProcAddress(handle, "JNI_CreateJavaVM");
    ifn->GetDefaultJavaVMInitArgs =
        (void *)GetProcAddress(handle, "JNI_GetDefaultJavaVMInitArgs");
    if (ifn->CreateJavaVM == 0 || ifn->GetDefaultJavaVMInitArgs == 0) {
        JLI_ReportErrorMessage(JNI_ERROR1, (char *)jvmpath);
        return JNI_FALSE;
    }
配置jdk一些初始化配置参数    
/* set the -Dsun.java.command pseudo property */
    SetJavaCommandLineProp(what, argc, argv);

    /* Set the -Dsun.java.launcher pseudo property */
    SetJavaLauncherProp();

    /* set the -Dsun.java.launcher.* platform properties */
    SetJavaLauncherPlatformProps();

JVMInit->ContinueInNewThread->JavaMain

ContinueInNewThread 只是创建一个线程并执行JavaMain函数。

虚拟机启动入口

JavaMain

int JNICALL
JavaMain(void * _args)
{
    //参数拷贝
    JavaMainArgs *args = (JavaMainArgs *)_args;
    int argc = args->argc;
    char **argv = args->argv;
    int mode = args->mode;
    char *what = args->what;
    InvocationFunctions ifn = args->ifn;

    JavaVM *vm = 0; //虚拟机数据结构指针
    JNIEnv *env = 0; //虚拟机运行环境
    jclass mainClass = NULL;
    jclass appClass = NULL; // actual application class being launched
    jmethodID mainID;
    jobjectArray mainArgs;
    int ret = 0;
    jlong start, end;

    RegisterThread(); //windows平台是空函数

    
    //InitializeJVM 调用虚拟机真正的入口函数
    /**
    InitializeJVM->CreateJavaVM 完成虚拟机初始化及启动
    初始化堆
    全局数据结构(锁、GC子系统)
    启动类库加载等等
    */
    start = CounterGet();
    if (!InitializeJVM(&vm, &env, &ifn)) {
        JLI_ReportErrorMessage(JVM_ERROR1);
        exit(1);
    }

    if (showSettings != NULL) {
        ShowSettings(env, showSettings);
        CHECK_EXCEPTION_LEAVE(1);
    }

    // java -version 输出版本信息后退出。
    if (printVersion || showVersion) {
        PrintJavaVersion(env, showVersion);
        CHECK_EXCEPTION_LEAVE(0);
        if (printVersion) {
            LEAVE();
        }
    }

    //没有指定jar或者入口类
    if (printXUsage || printUsage || what == 0 || mode == LM_UNKNOWN) {
        PrintUsage(env, printXUsage);
        CHECK_EXCEPTION_LEAVE(1);
        LEAVE();
    }

    FreeKnownVMs();  /* after last possible PrintUsage() */

    //启动虚拟机花了多长时间
    if (JLI_IsTraceLauncher()) {
        end = CounterGet();
        JLI_TraceLauncher("%ld micro seconds to InitializeJVM\n",
               (long)(jint)Counter2Micros(end-start));
    }

    //打印虚拟机环境参数
    if (JLI_IsTraceLauncher()){
        int i;
        printf("%s is '%s'\n", launchModeNames[mode], what);
        printf("App's argc is %d\n", argc);
        for (i=0; i < argc; i++) {
            printf("    argv[%2d] = '%s'\n", i, argv[i]);
        }
    }

    ret = 1;

    //加载入口类
    mainClass = LoadMainClass(env, mode, what);
    CHECK_EXCEPTION_NULL_LEAVE(mainClass);
    
    //JavaFX类应用使用,它没有main入口类。
    appClass = GetApplicationClass(env);
    NULL_CHECK_RETURN_VALUE(appClass, -1);
    
    //根据不同的java应用类初始化入口类
    PostJVMInit(env, appClass, vm);
    
    //获取 main方法ID
    mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                                       "([Ljava/lang/String;)V");
    CHECK_EXCEPTION_NULL_LEAVE(mainID);

    //要传给main方法的参数
    mainArgs = CreateApplicationArgs(env, argv, argc);
    CHECK_EXCEPTION_NULL_LEAVE(mainArgs);

    调用main方法,我们的应用由此启动
    (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

    //main方法返回了
    ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1;

    //销毁虚拟机、清理资源(堆、线程、各个子系统)、退出进程、异常退出则需要dump内存
    LEAVE();
}

      虚拟机初始化及启动在 InitializeJVM 中,jvm初始化过程很比较复杂了,涉及到几乎所有的jvm子系统,后续继续分解它。

    //InitializeJVM 调用虚拟机真正的入口函数
    /**
    InitializeJVM->CreateJavaVM 完成虚拟机初始化及启动
    初始化堆
    全局数据结构(锁、GC子系统)
    启动类库加载等等
    */

        由此我们的应用正式运行了
    (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

JVM--01--JVM 体系结构、HotSpot 阅读详情

相关推荐

OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)

OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)

HotSpot And OpenJDK

1. HotSpot HotSpot是JVM(Java Virtual Machine),是一个运行Java字节码的虚拟机。 HotSpot包括: 一个Java ClassLoader 一个Java字节码解释器 Client和Server模式的虚拟机,针对不同用途做优化 一些垃圾回收器 一组运行时库 为什么叫HotSpot? 因为这款虚拟机当...

6606

ZEMAX优化方法---【Zemax学习】

在光学系统自动设计中,优化设计是光学设计中的重要阶段,也是ZEMAX软件的核心功能,涉及评价函数、权因子、阻尼因子等重要概念。在常用的阻尼最小二乘法优化设计的基础上,ZEMAX给我们提供了三种优化选择:Optimization(局部优化)、Global Search(全局优化)和 Hammer Optimization(锤形优化)。

yh的博客 4448

HotSpot和OpenJDK入门

在本文中,我们将会介绍如何开始使用HotSpot Java虚拟机以及它在OpenJDK开源项目中的实现——我们将会从两个方面进行介绍,分别是虚拟机和虚拟机与Java类库的交互。 HotSpot源码介绍 首先让我们看看JDK源码和它所包含的相关Java概念的实现。检查源码的方式主要有两种: 现代IDE能够附加src.zip(在$JAVA_HOME目录),能够从IDE中访问 使

kobejayandy的专栏 3328

Android11 关于三方应用获取su权限

SELinux,全称Security-Enhanced Linux,是一种基于Linux内核的安全机制。它通过强制访问控制(MAC)来增强Linux系统的安全性,如果不禁用SELinux,完成下面的修改可能会导致设备进入Recovery界面!adb shell getenforce 为Permissive(宽容模式),查看报错日志,发现是客户apk想使用su命令提权,但是没有权限!对于保护系统资源和防止未经授权访问非常有帮助!系统这边做修改,让su权限下放到三方应用.客户的apk运行报错。

sinat_37429535的博客 1901

硬件工程师提前批真题及答案解析2

我们需要考虑题目可能的简化假设,即输入电阻 Ri​ 可能是 rbe​ 和 βre​ 的组合,但题目可能简化为: Ri​≈rbe​+βre​。由于锗管的正向导通电压较小(0.2 V~0.3 V),而硅管的正向导通电压较大(0.6 V~0.7 V),因此-4.7 V的电压差不符合硅管的特性,而更接近锗管的特性。在三极管电路中,静态电位是指在无信号输入时,三极管各电极的直流电压。re​ 是动态发射极电阻,通常可以近似为 re​=IE​VT​​,但在题目中已经给出了 re​=300Ω,因此可以直接使用这个值。

XU157303764的博客 777

终于搞清楚了:OpenJDK和Sun/Oracle JDK和hotspot什么关系

历史上的原因是,OpenJDK是JDK的开放原始码版本,OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。 把这些JRL许可证形式的Sun/OracleJDK源码和对应版本的OpenJDK源码进行比较,发现除了文件头的版权注释之外,其余代码基本上都是相同的,只有字体渲染部分存在一点差异,Oracle JDK采用了商业实现,而OpenJDK使用的是开源

当我谈编程时我谈些什么 9569

Windows上MSYS2的安装和使用

MSYS2这个工具我是越用越喜欢,很多东西放在Linux上如鱼得水但是放在Windows上就没那么好用,比如ffmpeg,opencv等直接引用就行了,这个工具真的很省事。接下来带你们看看它的妙用。1、好好研究确实妙用无穷。

jiexijihe945的博客 4141

请分别解释OpenJDK,Sun/Oracle JDK,Hotspot是什么?

OpenJDK是JDK的开放原始的版本,OpenJDK是Sun在2006年末把Java开源而形成的项目,要点:元老版本,开放源代码,可商用,Sun公司。

qq_53679247的博客 2479

r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration

港科大livox_camera_calib虽然操作方便,但是使用mid360雷达会有视角问题(投影三维点到相机),尝试了很多场景,标定效果都不理想(推荐场景是楼梯间),看来港大的更适合avia之类窄角度的雷达。如果标定效果不好的话,就使用 getExt2节点,getExt1节点只优化外参,而getExt2节点在计算的时候会将一开始计算的内参作为初值和外参一起优化。一般使用getExt1节点即可,如果在外参初值验证过,并且异常值已经剔除后,优化还是有较大的残差,那么可以使用getExt2试一试。

z1872385的博客 2399

超声相控阵合成孔径成像FPGA设计介绍

1.仿真预览 2.理论分析 系统的基本结构如下所示: 以上是实际中完整的结构,系统中会涉及到两块板子中的时钟,这个就是设计一个时钟采样同步的问题,即所谓的时钟同步。一般这种情况,往往使用内插的方式来解决。这是由于,在实际中,超生波接收到的信号是由本身系统发送出去反射回来得到的,因此从另外一方面将,其是同步的。但是在接收的时候通过内插的方法解决其中的延迟问题。 根据论文中的介绍,整个系统分为如下几个部分: ·模拟发送信号,这个部分由MATLAB产生测试数据并量...

FPGA/MATLAB学习教程/源码/项目合作开发 2069

Ubuntu 16.04下用apt-get安装Java的系统级实践

Java运行时环境(JRE)与开发工具包(JDK)是支撑企业级应用的基础软件栈,其部署质量直接影响系统稳定性与安全合规性。在Linux发行版中,apt-get不仅是包安装命令,更是集依赖解析、GPG签名验证、alternatives版本管理、安全更新推送于一体的系统级软件治理机制。尤其在Ubuntu 16.04这类长期服役的LTS系统中,OpenJDK 8通过apt-get集成,可确保与ca-certificates-java等关键组件自动协同,并满足等保三级日志审计与CVE快速修复要求。该方案广泛应用于电

weixin_30527323的博客 371

YOLOv8-Pose NCNN Android部署优化实践

本文探讨了在Android设备上高效部署YOLOv8-Pose姿态检测模型的优化实践。通过修改Pose头部导出逻辑,分离后处理到C++端实现,并替换SiLU激活函数为ReLU,显著提升了计算效率。具体步骤包括模型结构优化、ONNX导出、NCNN转换与算子融合,最终在Android端实现了30FPS的稳定推理性能。项目提供了完整的优化思路和实现方案,对移动端AI应用开发具有参考价值。

FJN110的博客 323

Java数组的长度到底能有多大

Java数组的长度到底能有多大? 博客分类: Java

sms0101的专栏 3529

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JVM 常见面试问答:深入底层原理

本文为Java后端开发、架构师及中间件开发岗位面试提供全面的JVM知识体系,涵盖内存模型、对象创建、类加载、垃圾回收、JIT编译、性能调优等核心内容。内容分为14个章节,从基础概念到高级场景实战,包括: JVM内存模型:程序计数器、虚拟机栈、堆、方法区等运行时数据区详解。 对象创建与内存分配:对象实例化过程、TLAB机制、逃逸分析等。 类加载机制:双亲委派模型、类加载阶段、自定义类加载器。 垃圾回收:分代回收算法、CMS/G1/ZGC等回收器对比与原理。

weixin_72753562的博客 1017

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

OpenJDK8-Hotspot虚拟机学习笔记

OpenJDK8-Hotspot虚拟机学习笔记一、JVM介绍二、类加载子系统三、运行时数据区1、程序计数器2、虚拟机栈3、本地方法栈4、堆5、元空间 一、JVM介绍 Java虚拟机就是二进制字节码的运行环境,可以让Java代码一次编译到处运行,能够自动的内存管理和垃圾回收。Java虚拟机包括类加载子系统、运行时数据区、执行引擎以及本地接口和本地方法库。 二、类加载子系统 类加载子系统中使用类加载器来加载.class文件,其中类加载器可以分为下面这几类: 引导类加载器(Bootstrap ClassLoa

weixin_43953150的博客 969

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

双管齐下, 清华教授亲码JDK和HotSpot源码笔记

这个月马上就又要过去了,还在找工作的小伙伴要做好准备了,小编整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

2401_83977825的博客 1081

java体系结构和jvm

具体JVM的内存结构,其实取决于其实现,不同厂商的JVM,或者同一厂商发布的不同版本,都有可能存在一定差异。主要以Oracle HotSpot VM为默认虚拟机。

程序员一博 629

jdk8和hotspot_HotSpot和OpenJDK入门

在本文中,我们将从虚拟机(VM)的角度以及与之交互的角度研究如何开始在HotSpot Java虚拟机上工作以及如何在OpenJDK开源项目中实现它。 Java类库。 HotSpot来源简介 让我们看一下JDK源代码以及其中包含的Java概念的实现。 检查源代码有两种主要方法: 现代IDE可以附加src.zip(来自$ JAVA_HOME),以允许从IDE进行访问,或者 使用O...

cunfu6353的博客 3667

Java 11 到 Java 17 的最佳 HotSpot JVM 选项和开关

一、前言 在本文中,你将了解 OpenJDK HotSpot Java 虚拟机 (HotSpot JVM) 中的一些系统知识,以及如何调整它们以获得最佳状态适应你的程序和运行环境。HotSpot JVM 是一项了不起且灵活的技术。它作为二进制版本适用于每个主要操作系统和 CPU 架构,从微型 Raspberry Pi Zero 一直到包含数百个 CPU 内核和 TB 级 RAM 的“大型”服务器。由于 OpenJDK 是一个开源项目,HotSpot JVM 几乎可以针对任何其他系统进行编译,并且可以使用选项

hnjsjsac的博客 2121

HotSpot与JVM概述

HotSpot到底是什么以及它与JVM和OpenJDK有什么关系?它到底是做什么的?另外,OpenJDK和HotSpot有什么区别? Java虚拟机规范 根据定义,JVM是虚拟机。即一个模拟真机操作的软件机器。像真机一样,它有一个指令集,一个虚拟计算机架构和一个执行模型。它能够运行用这个虚拟指令集编写的代码,就像真机可以运行机器代码一样。 HotSpot 是JVM概念的一个实现。它最初由Sun开发...

【莉婶】的博客 8248

OpenJDK新手教程之编译HotSpot

前言 讲OpenJDK/HotSpot编译的文章比较多了,玩Linux的朋友自是不在话下,Windows下的也有那么几篇: 《深入理解Java虚拟机》作者周志明的《自己动手编译Windows版的OpenJDK 7》(http://icyfenix.iteye.com/blog/1097344...

795

安装JAVA8要登录_JDK8的安装及环境配置

原文链接:https://www.cnblogs.com/chenxj/p/10137221.html1、下载JDK;b、或百度网盘:链接:https://pan.baidu.com/s/1S14y4_3eN9G6oOVfhmbe_w提取码:0cf62、双击安装程序,点击下一步安装目录若不修改,可直接下一步操作继续下一步,等待安装完成安装完毕。3、程序安装完毕后,进行环境变量的配置Java程序开发...

weixin_30884455的博客 597

什么是即时编译(JIT)!?OpenJDK HotSpot VM剖析

重点\u0026#xD;\u0026#xD;应用程序可以选择一个适当的即时编译器来进行接近机器级的性能优化。\u0026#xD;\t分层编译由五层编译构成。\u0026#xD;\t分层编译提供了极好的启动性能,并指导编译的下一层编译器提供高性能优化。\u0026#xD;\t提供即时编译相关诊断信息的JVM开关。\u0026#xD;\t像内联化和向量化之类的优化进一步增强了性能。\u0026#xD;...

cpongo011702 476

openjdk底层(hotspot)汇编指令调用(二)——寄存器定义

通过面向对象编程思想,定义了寄存器类和汇编器类,分别用于管理寄存器的名称、值以及汇编指令的编码规则。为了支持多平台,OpenJDK在share/asm目录下抽象了寄存器和汇编器的基类。

阿达King哥的博客 1151
上一篇: 在Windows平台编译OpenJdk8
下一篇: Android app加壳原理分析及壳程序编写
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值