相关文章推荐
坏坏的小狗  ·  UltraEdit批量删除空行_51CTO博 ...·  1 年前    · 
千杯不醉的路灯  ·  解决xxx by CORS policy: ...·  1 年前    · 
才高八斗的豆浆  ·  MySQL关于根据日期时间查询数据的sql语 ...·  2 年前    · 
老实的电梯  ·  如何利用异或运算进行简单加密解密_百度知道·  2 年前    · 
任性的冰淇淋  ·  chrome.tabs.create is ...·  2 年前    · 
Code  ›  深入理解Java之jvm启动流程开发者社区
虚拟机 jvm
https://cloud.tencent.com/developer/article/1038435?areaSource=106001.8
坚韧的马克杯
1 年前
作者头像
xiangzhihong
0 篇文章

深入理解Java之jvm启动流程

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 向治洪 > 深入理解Java之jvm启动流程

深入理解Java之jvm启动流程

作者头像
xiangzhihong
发布 于 2018-02-06 16:13:18
5.5K 0
发布 于 2018-02-06 16:13:18
举报

概述

当我们写一个Java类,并重写Main方法,程序就能运行起来。main方法的背后,程序为什么能运行,jvm究竟做了什么处理?要理解这些,就需要了解jvm的设计原理以及启动的流程。

虚拟机的启动入口位于share/tools/launcher/java.c的main方法,整个流程分为如下几个步骤: 1、配置JVM装载环境 2、解析虚拟机参数 3、设置线程栈大小 4、执行Java main方法

jvm启动流程分析

配置JVM装载环境

Java代码执行时需要一个JVM环境,JVM环境的创建包括两部分:JVM.dll文件的查找和装载。

JVM.dll文件查找

我们来看一段Jre通过环境的路径和系统版本寻找jvm.cfg文件的代码。

这里写图片描述
这里写图片描述

说明: 1、GetJREPath()查找当前JRE环境的所在路径; 2、ReadKnownVms()读取JRE路径\lib\ARCH(CPU构架)\JVM.cfg文件,其中ARCH(CPU构架)通过GetArch方法获取,在window下有三种情况:amd64、ia64和i386; 3、CheckJvmType确定当前JVM类型,先判断是否通过-J、-XXaltjvm=或-J-XXaltjvm=参数指定,如果没有,则读取JVM.cfg文件中配置的第一个类型; 4、GetJVMPath根据上一步确定的JVM类型,找到对应的JVM.dll文件;

JVM.dll文件的装载

调用JVM.dll文件中定义的函数初始化虚拟机中的函数。

这里写图片描述
这里写图片描述

JVM.dll文件的装载:

1、LoadLibrary方法装载JVM.dll动态连接库; 2、把JVM.dll文件中定义的函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs绑定到InvocationFunctions变量的CreateJavaVM和GetDefaultJavaVMInitArgs函数指针变量上;

虚拟机参数解析

装载完JVM环境之后,需要对启动参数进行解析,其实在装载JVM环境的过程中已经解析了部分参数,该过程通过ParseArguments方法实现,并调用AddOption方法将解析完成的参数保存到JavaVMOption中,JavaVMOption结构实现如下:

这里写图片描述
这里写图片描述

AddOption代码:

这里写图片描述
这里写图片描述

AddOption核心就是对-Xss参数进行特殊处理,并设置threadStackSize,因为参数格式比较特殊,其它是key/value键值对,它是-Xss512的格式。后续Arguments类会对JavaVMOption数据进行再次处理,并验证参数的合理性。

参数处理

Arguments::parse_each_vm_init_arg方法负责处理经过解析过的JavaVMOption数据,部分实现如下:

这里写图片描述
这里写图片描述

这里列出了JavaVMOption三个常用的参数: 1、-Xmn:设置新生代的大小NewSize和MaxNewSize; 2、-Xms:设置堆的初始值InitialHeapSize,也是堆的最小值; 3、-Xmx:设置堆的最大值MaxHeapSize;

参数验证

Arguments::check_gc_consistency方法负责验证虚拟机启动参数中配置GC的合理性,实现如下:

 
推荐文章
坏坏的小狗  ·  UltraEdit批量删除空行_51CTO博客_word如何批量删除空行
1 年前
千杯不醉的路灯  ·  解决xxx by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the requested resource问题-天翼云
1 年前
才高八斗的豆浆  ·  MySQL关于根据日期时间查询数据的sql语句 - _成飞 - 博客园
2 年前
老实的电梯  ·  如何利用异或运算进行简单加密解密_百度知道
2 年前
任性的冰淇淋  ·  chrome.tabs.create is giving an error - "Uncaught TypeError: Cannot call method 'create' of undefined" - Stack Overflow
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号