JVM学习(一)

JVM学习(一)

只记录在学习《深入理解Java虚拟机》时的一些个人理解,可能有理解错误的地方,欢迎指正

Java技术体系与Java语言发展史在之前已经学习过这里面不进行过多赘述

Java是编译型语言还是解释型语言

·“像C、C++ 他们经过一次编译之后直接可以编译成操作系统了解的类型,可以直接执行的 所以他们是编译型的语言。没有经过第二次的处理 而Java不一样他首先由编译器编译成.class类型的文件,这个是java自己类型的文件 然后在通过虚拟机(JVM)从.class文件中读一行解释执行一行,所以他是解释型的语言,而由于java对于多种不同的操作系统有不同的JVM所以 Java实现了真正意义上的跨平台!
因为虽然java也需要编译,编译成.class文件,但是并不是机器可以识别的语言,而是字节码,最终还是需要 jvm的解释,才能在各个平台执行,这同时也是java跨平台的原因。所以可是说java即是编译型的,也是解释型,但是假如非要归类的话,从概念上的定义,恐怕java应该归到解释型的语言中。”
–摘自https://blog.csdn.net/weixin_34114823/article/details/88675337
我觉得这段话说的比较清楚也有道理,具体的话也可以参照下面的Java运行机制理解。

Java运行机制

在编辑器里面写Java源程序,后缀名是.java——>再利用javac(java编译器)编译源文件——>生成字节码文件(.class)文件,所以前面有人说是编译型语言大概就是源自于这一步。
.class字节码文件就是交给Java虚拟机来执行了。这一步就是进行解释执行,虚拟机一行一行读字节码文件,一行一行解释执行。

JVM(Java Vietual Machine)虚拟机
Java的跨平台就是通过虚拟机来实现的,同样的字节码文件放在适应不同操作系统的虚拟机里面,针对不同操作系统解释执行,这样就能够实现跨平台了。

Java虚拟机发展史

1.首先是Sun Classic VM 第一款商用Java虚拟机:
大名鼎鼎,JDK 1.0自带虚拟机。只能用纯解释器执行Java代码。JIT编译器必须外挂。而且即使外挂了JIT编译器两者也不能配合使用,外挂了编译器,解释器就不执行。使用外挂编译器执行,编译器就要对每一个方法,每一句都进行编译。不敢应用编译耗时稍高的优化技术,所以奠定了Java很慢的基础印象。
2.接下来是Exact VM:
采用两级即时编译器,编译器与解释器混合使用工作模式。JDK1.2时用的虚拟机,应用时间很短就被HotSpot VM 所取代。
因为使用准确式内存管理而得名。
准确式内存管理什么意思?
虚拟机知道内存中的某个数据是什么类型。比如一个整数“123456”.虚拟机知道这个到底是代表的整数还是一个reference类的地址。在GC(垃圾回收)的时候可以准确判断数据是否可用或可回收。
GC后,一些仍然可用的数据会被改变位置,书中举例一个“123456”的地址中的数据被挪到了“654321”,如果虚拟机不能进行准确式的内存管理,就不敢把“123456”改成“654321”,因为它无法确定它是整数还是地址。
3.Sun HotSpot VM
这个大家就都了解了,Sun JDK和OpenJDK都用这个虚拟机,也是目前应用范围最广的虚拟机。
HotSpot(热点),顾名思义,HotSpot具有热点探测技术,又继承了两种虚拟机的优点。
所谓热点探测技术就是热点代码探测。通过执行计数器找到最具有编译价值的代码(为每个方法(甚至是代码块)建立计数器,执行次数超过阈值就认为是“热点方法”)。然后通过JIT编译器以方法的单位进行编译。
热点代码探测的是多次执行的方法,或者方法内部多次执行有效循环的部分

  1. 被多次调用的方法-----标准JIT编译
  2. 被多次调用的循环体-----发生在方法的执行中,称栈上替换
    没有超过计数器阈值的代码部分直接解释执行,而超过阈值的部分就以方法为单位编译以后再进行解释执行。
    对比前面的Classic VM 可以看处前者是所有的代码全部编译,无论其是否有编译价值,那么前者的慢就是必然了。

后面的其他几种JVM介绍并无技术部分,就不进行一一记录了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值