深入拆解Java虚拟机-极客时间 笔记
01 Java 代码是怎么运行的:
从虚拟机视角看,执行Java代码首先要将它编译而成的class文件加载到Java虚拟机中。加载后的Java类会被存放于方法区中。实际运行时,虚拟机会执行方法区的代码。
Java虚拟机会在内存中划分出堆和栈来存储运行时数据。会将栈细分为面向Java方法的Java方法栈,面向本地方法的本地方法栈,以及存放各个线程执行位置的PC寄存器。每当调用进入一个Java方法,Java虚拟机会在当前线程的Java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。当退出当前执行的方法时,不管是正常返回还是异常返回,Java虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。
为了满足不同用户场景需要,HotSpot内置了多个即时编译器:C1 C2 Graal。C1又叫Client编译器,面向的是对启动性能有要求的客户端GUI程序。采用的优化手段相对简单,因此编译时间较短。C2 又叫Server编译器,面向的是对峰值性能有要求的服务器端程序。从Java7开始,HotSpot默认采用分层编译的方式:热点方法首先会被C1编译,而后热点方法中的热点会进一步被C2编译。