《HotSpot实战》笔记1启动

来源:互联网 发布:linux修改文件名 编辑:程序博客网 时间:2024/05/18 00:23

1.启动

1.1.启动器

        Launcher(启动器)是用来启动JVM和应用程序的工具。HotSpot中提供了两种Launcher类型,分别是通用启动器和调试版启动器。

       通用启动器是指我们非常熟悉的JDK命令程序:java(javaw)。HotSpot提供了一个精简调试Launcher,成为gamma。相对于通用Launcher,gamma就安装在JVM库相同的目录下,或者与JVM库静态链接为一个库文件,因此可以把gamma看做是精简了虚拟机选项解析等逻辑的java命令。


1.2.虚拟机生命周期

       下图描述了一个完整的虚拟机生命周期,具体过程如下。

       (1)Launcher启动后,首先进入Launcher的入口,即main函数。main函数的重点是:创建一个运行环境,为接下来启动一个新的线程创建JVM并跳到Java主方法做好一切准备工作。

       (2)环境就绪后,Launcher启动JavaMain线程,将程序参数传递给它。

       (3)一般来说,JavaMain线程将伴随应用程序的整个生命周期。首先,它要做的便是在Launcher模块内调用InitializeJVM()函数,初始JVM。

       (4)前面提到的创建JVM的任务,实际上就是调用了JNI_CreateJavaVM()函数。JNI_CreateJavaVM()函数调用Threads模块create_vm()函数完成最终的虚拟机的创建和初始化工作。create_vm()函数是JVM启动过程的精华部分,它初始化了JVM系统中绝大多数的模块。

  • 调用add()函数,将线程加入线程队列。
  • 调用create()函数,创建虚拟机线程“VMThread”。
  • 调用vm_init_globals()函数,初始化全局数据结构。
  • 调用init_globals()函数,初始化全局模块。
  • 调用LoadClass函数,加载应用程序主类。
  • 调用jni_CallStataicVoidMethod()函数,实现对Java应用程序的主方法的调用。
  • 调用jni_DetachCurrentThread()函数。
  • 调用jni_DestroyJavaVM()函数,销毁JVM后退出。


1.3.入口:main函数


1.4.主线程

       一般来说,JavaMain线程将伴随应用程序的整个生命周期。JavaMain好比一个外壳,应用程序便是在这个外壳的包裹下完成执行的。



2.系统初始化

       系统初始化的过程是JVM启动过程中的重要组成部分。初始化过程涉及到绝大多数的HotSpot内核模块。下图描述了系统初始化的完成过程。



《HotSpot实战》系列笔记共计4篇:

  1. 启动
  2. 类与对象
  3. 运行时数据区
  4. 垃圾收集

0 0
原创粉丝点击