jvm进阶

jvm进阶_第1张图片

把java文件加载成class文件的过程 1.验证 (看是不是java文件)2.准备(给静态变量赋初始值,跟我们赋的值无关,只跟类型有关)

3.解析 4.初始化  5(把磁盘的java文件(源文件)丢进jvm)

jvm进阶_第2张图片

1.验证

jvm进阶_第3张图片

jvm进阶_第4张图片

2.准备

jvm进阶_第5张图片

问题:如果static变量前面加final 也是在准备的时候赋值为默认值吗

答:在准备的时候不复制

类加载过程

jvm进阶_第6张图片

进入命令终端:

jvm进阶_第7张图片

jvm进阶_第8张图片

语言无关性(跨无言):因为作为jvm不识别java语言还是什么scale语言等,只识别class文件(也就是字节码),语言只是一个规范

jvm进阶_第9张图片

JVM内存结构

虚拟机栈(方法的入栈和)出栈

jvm进阶_第10张图片

jvm进阶_第11张图片

jvm进阶_第12张图片

局部变量表 存局部变量和对象的引用

jvm进阶_第13张图片

jvm进阶_第14张图片

虚拟机栈为什么有操作数栈勒?

答:执行引擎在执行字节码的中间是有一些数据需要放在放在操作数栈的,类似于cpu

主内存缓存的架构

程序计数器的作用:

jvm类似于一个操作系统

对于操作系统:cpu时间片轮转机制,比如 线程a执行到13行 将要被阻塞或者挂起,线程b来执行,线程b执行完了,线程a从13行往下执行,所以要用程序计数器记录执行的行号,

jvm程序计数器跟操作系统的程序计数器其实是一个映射关系

程序计数器在jvm内存中唯一不会oom的  因为他只是计数 

jvm进阶_第15张图片

虚拟机有多个方法为啥不需要多个程序计数器勒?

是因为一个线程不可能同时执行多个方法

jvm进阶_第16张图片

你可能感兴趣的:(jvm,java,开发语言)