JVM笔记

jvm 的生命周期 

main方法是jvm实例运行的起点;main()作为程序初始线程的起点,任何其他线程都是由该线程负责启动,main线程是非守护线程。

jvm实例消亡

所有的非守护线程都终止时

System.exit();

Jvm运行流程

Java代码编译是由Java源码编译器来完成的,流程如下JVM笔记

Java字节码的执行是由JVM执行引擎来完成的。流程如下JVM笔记

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没有寄存区,所有参数传递都是使用操作数栈

 

  栈上分配JVM笔记JVM笔记

  逃逸分析

        -XX:+DoEscapeAnalysis

        进行逃逸分析之后,产生的后果是所有的对象都将由栈上分配,而非从JVM内存模型中的堆来分配。

 

 

指令重排

 

JVM常见参数配置

Trace跟踪参数

1. 打印GC日志信息:  -verbose:gc  -XX:+PrintGCDetails

2.GC日志文件目录: -Xloggc:D:/gc.log

3.打印堆信息: (每一次gc后) -XX:+PrintHeapAtGC

4. 打印类加载信息: -XX:+TraceClassLoading