JVM从零开始:Java重要概念与JVM(二)

480 阅读4分钟

原文地址:www.sudo.ren/article/81?…

Java的体系结构主要由Java编程语言、字节码、Java API 和Java虚拟机相关技术组成。 1.Java语言编写程序; 2.前端编译器(javac)将Java源码编译为字节码文件(*.class); 3.JVM将字节码装载进其内部,然后解释/编译为对应平台上的机器指令。

Java语言:Java大约定义51个关键字。

Java继承了C语言的语法结构,改编了C++的对象模型。并且Java舍弃了C和C++中很多不安全的语法特性。比如:

  • 废弃指针操作;
  • 自动内存管理;
  • 数组边界检查;
  • 类型转换检查;
  • 线程安全机制;
  • 物理环境访问限制。

字节码:

Java源码的编译结果不是本地机器指令,而是字节码,这就很好的解决了程序的安全性,跨平台移植性等问题。我们可以将编译后的字节码部署到其他装有jre环境下,同样可以正常运行,这就是我们经常说的“一次编译,处处运行”

JavaAPI:

API即为应用程序编程接口,是一些预定义的接口,提供应用程序与开发人员给予软件或硬件的以访问一组例程的能力,而又无需访问源码或理解内部工作机制细节。其中包含了Java的基础类库集合,提供了一套访问主机系统资源的标准方法。

Java虚拟机:

JVM是由一组规范所定义出的抽象计算机。负责将字节码装载到其内部,解释/编译为对应平台上的机器指令。我们接下来要学习的就是HotSpot VM,它是目前市面上高性能虚拟机之一。HotSpot具备热点探测功能,能将一个被频繁嗲用的方法或方法体中有效循环次数较多的代码块标记为“热点代码”,然后通过内嵌的双重JIT(Just In Time Compiler)编译器将字节码直接编译为本地机器指令。HotSpot中编译器和解释器并存,依赖热点探测功能确定字节码指令通过解释运行,还是编译运行。

编译器/解释器在虚拟机的运行:

虚拟机启动,解释器便开始发挥作用,不必等编译器全部编译完成再执行,这样可以节省很多编译时间。根据热点探测功能,编译器会将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率。

HotSpot中内嵌2个JIT编译器:

系统与物理硬件自动选择哪种编译器,开发人员也可手动显示调用编译策略。默认情况下开启分层编译策略,由C1和C2编译器相互协调共同完成编译工作。

  • Client Compiler(C1):对字节码进行简单可靠的优化,已达到更快的编译速度;
  • Server Compiler(C2):启动一些编译耗时更长的优化,以获取更好的编译质量;

完全解释/完全编译

开发人员可以手动调用HotSpot VM使用完全编译,还是完全解释。

  • 完全解释:编译器将停止所有的工作,字节码将完全依赖解释器逐渐解释执行;
  • 完全编译:解释器仍然会在编译器无法进行的特殊情况下接入执行。

Java技术特性:

  • Java语言无关性:JVM能运行java语言以及其他编程语言编写的应用程序。Java语言本身本身不支持其他语言特性,但JVM支持(只要满足并包含jvm的内部指令集、符号以及其他辅助信息,就是一个有效的字节码文件,能被JVM装载运行)
  • Fork/Join 实现多核并行:(java5以后,java.util.concurrent包下)任务拆分到最小,然后每个单独被计算运行。(如:Hadoop Map/Reduce)
  • Java7新特性:switch(支持String,二进制),try-with-resources自动管理资源,泛型推断运算符,全新的文件系统NIO2.0、Fork/Join
  • 32位机最大支持4GB内存:Java堆区内存最大分配(windows 1.5G,linux 2~3G)
  • JDK1.6 update14开始:提供指针压缩功能,通过对齐补白等操作将64位指针压缩位32位,改善CPU缓存使用率,提升64位JVM性能将。update14~update22之间,可通过"-XX:+UseCompressedOops" 显示开启指针压缩,update23之后,默认开启。

OpenJDK/Oracle JDK:

  • OpenJDK:
    1.HotSpot用C++,少量C和汇编编写,其他内容都用Java(如基类库);
    2.是Sun/Oracle JDK的开源版本(2009年发行第一个版本);
    3.与Oracle JDK7相比,少量代码采用其他技术替代。
  • Oracle JDK:
    1.HotSpot用C++,少量C和汇编 编写,其他内容都用Java(如基类库);
    2.适合个人开发,不能商用。
  • 市面基于OpenJDK定制的JVM:
    TaoBao JVM:在某一业务方面性能强,但无法通用,严重依赖CPU类型:Intel CPU,编译手段采用IntelC、CPP
    Complier,提升GC性能,使用crc32指令实现JVM intrinsic 降低JNI(jav本地接口)的调用开销。