深入理解JVM虚拟机 第一章走进java

前言:

系统介绍Java的技术体系、发展历程、虚拟机家族、以及自己动手编译JDK的方法。

1. Java技术体系
  • JDK:Java程序设计语言、Java虚拟机、java类库这三部分统称为JDK(Java Development Kit),是用于支持Java程序开发的最小环境。

  • JRE:Java类型API中的Java SE API子集和Java虚拟机这两部分统称为JRE(Java Runtime Environment),是支持Java程序运行的标准环境。

2. Java虚拟机家族 (一次编译,到处运行)
  • Classic VM:“世界第一款商用Java虚拟机”,这款虚拟机只能使用纯解释器方式来执行Java代码。假如外挂了即时编译器的话,即时编译器就会完全接管虚拟机的执行系统,解释器便不能再工作了。

  • Exact VM:因它使用准确内存管理(EXact Memory Management)而得名,Exact VM可以抛弃掉以前Classic VM基于句柄(Handle)的对象查找方式。

  • HotSpot VM:继承了Classic VM和Exact VM的优点(如准确内存管理),也有自己的新的技术,热点代码探测技术等。(PS:热点代码探测能力可以通过执行计数器找出最具有编译价值的代码。如果一个方法被频繁调用,或方法中有效循环次数很多,将分别触发标准即时编译和栈上替换编译行为)

  • JRockit VM:一款专门为服务器硬件和服务端应用场景高度优化的虚拟机,它可以不太关注程序启动速度,因此JRockit内部不包含解释器实现,全部代码都靠即时编译器编译后执行。

  • IBM J9 VM:IBM J9直至今天仍旧非常活跃,IBM J9虚拟机的职责分离与模块化做得比HotSpot更优秀。

  • Zing VM:Zing虚拟机是从一个HotSpot某旧版本代码分支基础独立重新开放出来的高性能java虚拟机。Azul公司为它编写了新的垃圾收集器,也修改了HopSpot内的许多实现细节,在要求低延迟、快速预热等场景中,表现都比HotSpot表现得更好。Zing的PGC、C4收集器可以轻易支持TB级别的java堆内存,而且保证暂停时间 仍然可以维持在不超过10毫秒的范围内。

3. 新一代即时编译器

​ 对需要长时间运行的应用来说,由于经过充分预热,热点代码会被HotSpot的探测机制准确定位捕获,并将其编译为物理硬件可直接执行的机器码,在这类应用中java的运行效率很大程度上取决于即时编译器所输出的代码质量

  • HotSpot虚拟机中含有两个即时编译器,分别是编译耗时短但是输出代码优化程度较低的客户端编译器(C1)以及编译耗时长但是输出代码优化质量也更高的服务端编译器(C2)

    扫描二维码关注公众号,回复: 12691949 查看本文章
  • 新一代即时编译器:Graal编译器。Graal编译器比服务端编译器晚了足足二十年面世,有着极其充沛的后发的优势,在保持输出相近质量的编译代码的同时,开发效率和扩展性上都要显著优于C2编译器,这决定了C2编译器中优秀的代码技术可以轻易地移植到Graal编译器上,但是反过来Graal编译器中行之有效的优化在C2编译器里实现起来异常艰难。在某些测试项中已经逐渐反超C2编译器。Graal能够比C2更加复杂的优化,如"部分逃逸分析"(Partial Escape Analysis),也拥有比C2更容易使用激进预测性优化策略,支持自定义的预测性假设。

4. 本章疑问
  1. 什么是解释器和即时编译器
  2. 什么是用户态和内核态

猜你喜欢

转载自blog.csdn.net/weixin_44981707/article/details/110928400