《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篇:
- 启动
- 类与对象
- 运行时数据区
- 垃圾收集
- 《HotSpot实战》笔记1启动
- 《HotSpot实战》笔记2类与对象
- 《HotSpot实战》笔记4垃圾收集
- 《HotSpot实战》笔记3运行时数据区
- Java虚拟机HotSpot笔记
- 《实战HotSpot JVM GC》分享Slides
- 【笔记】HotSpot虚拟机对象探秘
- HotSpot SA #1:JStack
- HotSpot
- maven实战笔记-1
- maven实战笔记-1
- Java实战笔记1
- 机器实战笔记1
- Spring实战笔记 1
- 学习笔记一:HotSpot中的一些概念
- HotSpot运行时概览#1
- Weblogic启动时报错:HotSpot Virtual Machine Error
- ODBC编程实战 笔记1
- 我为什么当程序员
- X64下的解析句柄表
- git使用小结(安装,git添加版本库,git与github链接)
- 分析JDBC ResultSet
- sql plus 和 pl/sql无法连接远程oracle数据库
- 《HotSpot实战》笔记1启动
- python ucs-2与ucs-4编码方式判断
- java.lang.Long cannot be cast to java.lang.Integer!
- HDU1251 统计难题题解(字典树入门)
- eaglephp使用微信api接口开发微信框架
- sed以及awk的替换命令
- 补第八周项目5---定期存款利息计算器
- linux(centos)下VPN搭建
- Hduoj1754【线段树】