JVM
一、JVM是什么
JVM:Java virtual Machine,Java虚拟机,是java平台的一部分,能够运行Java的字节码文件(bytecode),包含JRE(Java运行时环境)和JDK(Java开发工具包),也是Java实现跨平台的基础,不同的操作系统都有对应版本的JVM,来执行字节码文件,从而实现Java的跨平台。
主流JVM有,JRockit VM,HotSpot VM和J9 VM,我们现在用到的,一般都是HotSpot VM,如上图。
二、字节码的执行过程
1.由以【.java】结尾的Java源文件通过JDK中的编译工具【Javac】编译生成以【.class】结尾的字节码文件
2.将字节码文件解释为010100110....的二进制文件,交给操作系统执行,将字节码文件翻译成机器码执行时提供了两种方式
a.JIT(Just-In-Time)编译执行器:负责即时编译执行,编译后的编译结果会保存在缓存区,以提高性能。
b.解释执行器:负责逐条将字节码翻译成机器码并执行。
【PS】JVM中,解释执行与编译执行并存,解释器与编译器两者各有优势,当程序需要迅速启动和执行时,解释器可以首先发挥作用,省去编译的时间,立即执行,在程序运行后,即时编译器逐渐发挥作用,它可以对反复执行缓存后的热点代码,以获取更高的执行效率。但由于缓存的指令是有限的,如果每条代码都进行编译,缓存,会增加系统开销,所以,当程序运行环境中的内存资源限制较大时,可以使用解释器执行节约内存,反之可以使用编译执行来提升效率。
【Javap -c】指令可以将字节码文件反编译出当前类对应的机器码,感兴趣的也可以看一下,但是好像对工作用处不大,此处自行脑部捂脸的表情。部分指令介绍:
const系列:将指定数据进行压栈,如iconst_1,将int类型的局部变量1压入栈顶
store系列:将指定数据存入本地变量,如istore_3,将int类型的局部变量3存入本地变量
load系列:将指定数据的索引推至栈顶,如iaload,将int类型的数组的索引推至栈顶
运算符系列:isub 相减 imul相乘 idiv相除 irem取模等
自增自减指令:iinr,如iinr2,1,第三个整形变量自增1
三、JVM的作用
1.可以通过修改堆内存的大小有效防止内存泄漏和内存溢出。
2.优化线程锁的使用,JDK1.8以后对synchronized锁进行了调整,轻量级锁,重量级锁和自旋锁等。
3.通过调整栈内存的大小来提高系统的吞吐量。
4.通过调整新生代老年代的小大,降低延迟,提高系统性能。
四、JVM的组成
运行数据区
堆:存放系统运行过程中产生的各种对象。
栈:包括线程栈和本地方法栈,各个线程在执行时会开辟独立的内存空间。
方法区:静态变量,常量,字节码文件,JDK1.8以后使用的是物理内存。
程序计数器:存储每个线程执行的位置,通过执行引擎修改程序执行的位置标记。