作为一名java开发者,jvm一定是必须知道了
java往事我们直接跳过
版本迭代
- 1991 年,James Gosling 博士发布产品 Oak( 橡树),这是 Java 语言的前身。
- 1995 年,Oak 语言改名为 Java。
- 1996 年,JDK(Java开发所使用的工具包)1.0 发布,提供了纯解释执行的 Java 虚拟机实现:Sun Classic VM。
- 1997 年,JDK1.1 发布,代表技术有:JDBC、JavaBeans、内部类、反射。
- 1998 年,JDK1.2 发布,Java 技术体系被拆分为 J2SE、J2EE、J2ME 三大体系。
- 2000 年,JDK1.3 发布,默认的 Java 虚拟机由 Sun Classic VM 改为 HotSopt。
- 2002 年,JDK1.4 发布,Java 真正走向成熟,代表技术有:正则表达式、NIO等。
- 2004 年,JDK5.0 发布,对语法易用性做了很大改进,新增了泛型、枚举等,代表技术有:并发包等。
- 2006 年,JDK6.0 发布,将 J2EE/J2SE/J2ME 的命名方式改为 Java SE 6、Java EE 6、Java ME 6。
- 2009 年,Sun 公司因为经营不善被 Oracle 公司收购。
- 2011 年,JDK7 发布。
- 2013 年,JDK8(LTS) 发布,函数式编程,lamda表达式。
- 2017年,JDK9
- 2018年,JDK 10,11(LTS)正式发布
- 2019年,JDK 12,13
- 2020年,JDK 14,15
- 2021年,JDK 16,17(LTS)
一般企业用的是JDK8,比较稳定
两种jdk
openjdk vs oraclejdk:
- Oracle JDK将更多地关注稳定性,它重视更多的企业级用户,而OpenJDK经常发布以支持其他特性,不太稳定。
- Oracle JDK支持长期发布的更改(LTS),而Open JDK仅支持计划和完成下一个发行版。
- Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。
- 2019年1月之后发布的Oracle Java SE 8的公开更新将无法用于商业,但是,OpenJDK是完全开源的,可以自由使用。
- Oracle JDK的构建过程基于OpenJDK,因此OpenJDK与Oracle JDK之间没有技术差异。
- 顶级公司正在使用Oracle JDK,Open JDK不太受欢迎。
- Oracle JDK具有良好的GC选项和更好的渲染器,而OpenJDK具有更少的GC选项
- 在响应性和JVM性能方面,Oracle JDK提供了更好的性能。
- Oracle JDK在运行JDK时不会产生任何问题,而OpenJDK有时会产生一些问题。
- Oracle JDK将从其10.0.X版本将收费,用户必须付费或必须依赖OpenJDK才能使用其免费版本。
- Oracle JDK完全由Oracle公司开发,而Open JDK项目由IBM,Apple,SAP AG,Redhat等顶级公司加入和合作。
总结:Oracle还是更受企业欢迎,更稳定
知道了jvm我们更要jvm体系
JVM体系
所谓的一次编码,随处运行 就是jvm掩饰了接口的差异。详细看图
jdk是开发人员的工具包,它包含了java的运行环境和虚拟机,而一次编写到处运行就是基于jvm
知道了体系,我们就看看各种虚拟机
、Sun Classic VM
世界上第一款商用 Java 虚拟机。
1996年随着Java1.0的发布而发布,JDK1.4时完全被淘汰
2、BEA JRockit
专注于服务端应用,号称是世界上最快的JVM
后来被 Oracle收购;Oracle JRockit (原来的 Bea JRockit)
3、IBM公司的 J9VM
全称:IBM Technology for Java Virtual Machine,简称IT4J,内部代号:J9
是 IBM 自己开发的一款 JVM
市场定位于HotSpot接近,服务器端、桌面应用、嵌入式等多用途VM
4、HotSpot VM(现在最常用)
它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。
5、其他
(TaobaoJVM 、Graal VM、Azul VM、Liquid VM、Apache Harmony、)虚拟机
怎么查看直接上命令
java -version
反馈的具体参数
- hotspot虚拟机
- Client VM是专门为快速启动和小内存(small footprints)而优化的,像GUI就很适合
- Server VM是专门为高性能应用而优化的,如服务器应用
- 版本是基于tag为1.8.0_18
java运行过程
1.源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件)
2.类加载:通过ClassLoader及其子类来完成JVM的类加载
3.类执行:字节码被装入内存,进入JVM虚拟机,被解释器解释执行
关于模型直接上图
由上面的图可以看出,JVM虚拟机中主要是由三部分构成,分别是类加载子系统、运行时数据区、执行引擎。
类加载子系统
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验(类的正确性)、转换解析(将常量池内
的符号引用转换为直接引用的过程)和初始化(给变量赋值),最终形成可以被虚拟机直接使用的Java类型。
运行时数据区
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。
这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。
执行引擎
执行引擎用于执行JVM字节码指令,主要有两种方式,分别是解释执行和编译执行,区别在于,解释执行是在执行时翻译成虚拟机指令执行,而编译执行是在执行之前先进行编译再执行。
解释执行启动快,执行效率低。编译执行,启动慢,执行效率高。
垃圾回收器就是自动管理运行数据区的内存,将无用的内存占用进行清除,释放内存资源。
本地方法库、本地库接口
在jdk的底层中,有一些实现是需要调用本地方法完成的(使用c或c++写的方法),就是通过本地库接口调用完成的。比如:System.currentTimeMillis()方法。
了解jvm后续的一切动作,先从字节码开始。它是一切发生的源头。
郎伟今天就写道这里了,明天会讲字节码的知识