JVM学习笔记-01

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以后使用的是物理内存。
       程序计数器:存储每个线程执行的位置,通过执行引擎修改程序执行的位置标记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值