JVM笔记
jvm 的生命周期
main方法是jvm实例运行的起点;main()作为程序初始线程的起点,任何其他线程都是由该线程负责启动,main线程是非守护线程。
jvm实例消亡
所有的非守护线程都终止时
System.exit();
Jvm运行流程
Java代码编译是由Java源码编译器来完成的,流程如下
Java字节码的执行是由JVM执行引擎来完成的。流程如下
JVM的组成
Class Loader
类加载器负责加载字节码都jvm中,根据类中定义的内容分配到不同的运行时数据区。类加载器分类:1
1. Bootstrap ClassLoader : 位于rt.jar, 根加载器
2.extensions class loader : 扩展类加载器
3.system class loader : 系统类加载器
4.自定义类加载器
Class Loader加载过程
1.加载: 负责找到class文件,并加载到jvm中
2.连接:
校验: 确保类的格式正确;
准备: 为类中的变量分配内存空间,并初始化默认值;
解析: 符号引用转换为直接引用
3.初始化: 执行静态代码块,构造器,静态属性
在调用new(), 反射调用类中的方法,子类调用初始化函数
栈
操作数栈
java没有寄存区,所有参数传递都是使用操作数栈
栈上分配
逃逸分析
-XX:+DoEscapeAnalysis
进行逃逸分析之后,产生的后果是所有的对象都将由栈上分配,而非从JVM内存模型中的堆来分配。
堆
指令重排
JVM常见参数配置
Trace跟踪参数
1. 打印GC日志信息: -verbose:gc -XX:+PrintGCDetails
2.GC日志文件目录: -Xloggc:D:/gc.log
3.打印堆信息: (每一次gc后) -XX:+PrintHeapAtGC
4. 打印类加载信息: -XX:+TraceClassLoading