一、前言
其实一直都想系统性的学习一下 JVM
,尝试过很多次,最终没能坚持下来,现在已经工作多年,发现对于 JVM
这块知识还是很薄弱,不利于职业长远发展,并且之前掌握的都是一些零散的知识,没能形成体系,趁着这段时间不是很忙,打算集中精力,花一个月的时间仔细学习一下,借助于《深入理解 Java 虚拟机》第三版,帮助我梳理知识脉络,参考尚硅谷宋红康的视频,尽量降低学习成本,基于 JDK8
,HotSpot
学习,通过写博客的形式记录学习进度,监督自己。
二、Java 及 JVM 简介
Java
是一门高级语言,操作系统是无法直接运行或者说识别高级语言的程序代码的,简单来说操作系统只能识别二进制的机器指令(01
串),那么我们就需要将语义化的程序片段转变成系统可识别的指令,这一步有点类似与翻译,而 JVM
其中的一个主要作用就是翻译,但是不仅仅是翻译,更是提供了一套特定的运行环境,脱离了宿主平台的操作系统限制,直接运行在 JVM
之中。只要你具备 JVM
环境,就可以运行 Java
程序,从而实现了跨平台。但是想要调用系统层面的资源,永远也绕不开机器指令的操作,最终还是需要 JVM 通过一些手段去操作底层系统,这就导致了多走了一段“弯路”,这也是一直被诟病的说 Java
效率低的主要原因。
JVM
这种模式,给其它语言提供了思路,以至于现在不仅仅是Java
,只要你的语言能编译成我JVM
平台能够识别的字节码文件,都可以在 JVM
上跑起来。例如: Kotlin
、Groovy
、Scala
等。当然你也可以根据规范写一个自己的虚拟机,附上参考文档:https://docs.oracle.com/javase/specs/index.html
当然Java
除了跨平台的特性外,另一大优点就是垃圾回收机制,简单说在程序的生命周期中,对于对象我们只管在用的时候创建,不需要过多关注在什么时候回收,这给开发带来了极大的便利性。当然,这无疑也是一把双刃剑,对内存资源不敏感的开发者,很容易无意间写出一些存在内存风险的代码,内存泄漏和内存溢出。
可以在这里看到市场的使用情况:https://www.tiobe.com/tiobe-index/
目前 Java
主要运用于服务端项目开发,社区活跃,开源项目众多,也是目前生态最完善的语言之一。
三、Java 发展历程
1990 年诞生,1995年 Sun 正式发布 Java 和 HotSport。一直迭代维护,到 2004 年,将命名方式改为大版本,从 JDK1.5 改为 JDK5.0,之后开启新纪元,2006 年发布 JDK6,并且开源建立 OpenJDK。这个时候其实 JVM 的优势开始被 Sun 盯上了,2008 年,Oracle 收购了 BEA,得到了 JRockit 虚拟机。随着慢慢发展,有一些其它语言也加入到Java虚拟机平台来,直到 2010 年,Oracle 收购了 Sun,获得了 Java 商标和 HotSpot 虚拟机,这个时候它就掌握了市面上占用率最高的两款虚拟机 JRockit 和 HotSpot,并且计划合二为一,创造 HotRockit,当然难度很大,应该是整合了部分,但是名称还是叫 HotSpot。2011 年 JDK7, 启用G1垃圾回收器。2017 年,JDK9 发布,G1 成为默认GC,替代 CMS,同时 IBM 开源 J9。后面JDK更新越来越频繁,逐渐开器商业化模式,2018年,Oracle 宣布 JavaEE 成为历史名词,并且将 JDBC,JMS,Servlet 赠予 Eclipse 基金会,同年发布另一个 LTS 版本 JDK11,并且发布革命性 ZGC,调整 JDK 的授权许可,分为 OpenJDk 和 OracleJDK 两个版本维护。2019 年 JDK12 发布,加入由 RedHat 领导开发的 Shenandoah GC。截至目前最新已经发展到 JDK23 了,但是市面上大多数依然还是 JDK8 的版本,所以我们从 JDK8 开始学习还是比较科学的。
四、JDK 和 JRE 的关系
五、JVM 架构
以下为 JVM 架构的模型图,不用刻意死记硬背,一定要理解,我之前每次面试前都会背,造成后果就是,我以为我知道了,但是其实啥也不是,欺骗自己而以,随便细问就露馅。
简图
详细图
六、总结
先对于 Java 和 JVM 有一个初步的认识,对于 Java 跨平台的原理有一个大致了解,并且认识到 JVM 的重大作用,JVM 是比 Java 语言更加伟大的发明。