认识JVM
搞懂了JVM的一些优化手段,更加知道什么样的代码会被优化
1、什么是JVM
JVM就是java虚拟机,他是java运行的载体
Java和JVM
计算机只识别0和1。
Java是⾼级语⾔。⾼级语⾔编写的程序要想被计算机执⾏,需要变成⼆进制形式的本地机器码。能直接变成机器码的语义是C++,它的缺点是不同操作系统, 需要准备多份。Java需要先变成Java字节码(class⽂件)。然后再变成机器码。
JVM可以实现Java的⼀次编译,到处运⾏
这个就是区别于类似于C语⾔的⽅式
机器码是电脑CPU直接读取运行的机器命令,运行速度最快,但是非常晦涩难懂,也比较难编写,一般从业人员接触不到。
字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码
JDK、JRE和JVM
OracleJDK和OpenJDK
查看JDK版本:java -version
(1)如果是Sun/Oracle JDK显示为:
[root@localhost ~]# java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixedmode)
说明:
Java HotSpot™ 64-Bit Server VM 表明,此JDK的JVM是Oracle的64位HotSpot虚拟机,运行在Server模式下(虚拟机有Server和Client两种运行模式).
Java™ SE Runtime Environment (build 1.8.0_ 162-b12) 是Java运行时环境(即JRE)的版本信息.
(2)如果OpenJDK,显示信息为:
[ root@localhost ~]# java -version
openjdk version 1.8.0 144"
OpenJDK Runtime Environment (build 1.8.0 144-b01 )
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode )
OpenJDK的来历
Java由SUN公司(Sun Microsystems,发起于美国斯坦福大学,SUN是(Stanford University Network的缩写)发明,2006年SUN公 司将
Java开源,此时的JDK即为OpenJDK
也就是说,OpenJDK 是java SE的开源实现,它由SUN和Java社区提供支持,2009年Oracle收购 了Sun公司,自此Java的维护方之一的SUN也变成了Oracle .
大多数JDK都是在OpenJDK的基础上编写实现的,比如IBMJ9, AzulZulu,Azul Zing和Oracle JDK.几乎现有的所有JDK都派生自OpenJDK,它们之间不同的是许可证:
OpenJDK根据许可证GPL v2发布; .
Oracle JDK根据Oracle二进制代码许可协议获得许可。
Oracle JDK的来历
Oracle JDK之前被称为SUNJDK,这是在2009年Oracle收购SUN公司之前,收购后被命名为Oracle JDK。
实际上,Oracle JDK是基于OpenJDK源代码构建的,因此Oracle JDK和OpenJDK之间没有重大的技术差异。
Oracle的项目发布经理Joe Darcy在OSCON 2011.上对两者关系的介绍也证实了OpenJDK 7和Oracle JDK 7在程序上是非常接近的
两者共用了大量相同的代码(如下图)
注意:图中提示了两者共同代码的占比要远高于图形上看到的比例,所以我们编译的OpenJDK基本.上可以认为性能、功能和执行
逻辑上都和官方的Oracle JDK是一致的.
Oracle JDK与OpenJDK的区别
OpenJDK使用的是开源免费的FreeType,可以按照GPL v2许可证使用.GPL V2允许在商业上使用;
Oracle JDK则采JRL(Java Research License, Java研究授权协议)放出RL只允许个人研究使用,要获得Oracle JDK的商业许可证,需要联系Oracle的销售人员进行购买。
JVM和Hotspot
JVM是《JVM虚拟机规范》中提出来的规范。
Hotspot;是使用JVM规范的商用产品,除此之外还有Oracle JRockit、IBM的J9也是JVM产品
JRockit是Oracle的JVM, 从Java SE 7开始,HotSpot和JRockit合 并为一个JVM。
如何学习JVM
这是一张架构图,同时也是我们的学习路径
程序执行方式主要有三种:静态编译执行、动态编译执行和动态解释执行。
注意:此处所说的编译指的是编译成可让操作系统直接执行的机器码。