JVM原理(一):JVM基础知识
一、概述
JVM是java程序运行的基础环境,也是作为java开发必须了解的重要知识。了解jvm的基础知识可以帮助开发人员写出更高效的运行代码,也可以提升程序的性能。
jvm可以理解为一种虚拟机,它的职责就是将编译之后的字节码转化为机器可以执行的的代码。同时它具备资源管理能力,比如线程管理,内存分配及垃圾回收等功能。
二、JVM、JRE、JDK的区别
在java开发中,我么经常看到JVM、JRE、JDK名词,他们之间有什么关联,以及对应的作用是什么?
- JDK(Java Development Kit):java开发工具套件,为开发者提供java开发所需的环境,包括基础类库、javac 编译工具和javadoc 等工具。
- JRE(Java Runtime Environment):java运行时环境,提供jvm 核心类库及支持文件等。
- JVM(Java Virtual Machine) :java虚拟机,它接收字节码,并把它转化为机器可以读取和执行的代码。
三、JVM的基本特性
jvm区别于CPU使用的寄存器架构改用基于栈技术的实现,让它具备可移植性。使得java开发成本降低,同时也让开发不需要考虑平台的差异性。栈技术的优势,让jvm拥有以下的特性:
- 可移植性:java代码可以在任何安装jvm的机器上运行,而不需要考虑平台的差异性
- 内存管理:jvm提供了内存自动回收机制,对于不在使用的对象进行内存回收,降低内存溢出的风险
- 即时编译:jvm在运行时会将热点代码编译成机器码进行缓存,从而提高运行效率。
- 可观测:jvm提供各种监控接口及监控工具,可以让开发者调试提升系统的性能。
四、JVM 的构成
了解完jvm的特性,接下来我们看一下jvm的组成。jvm主要有三大系统组成分别为:类加载子系统,执行引擎和运行时数据区。
- 类加载子系统:负责将编译完的字节码加载到内存中,并在运行到过程中解析和验证文件的准确性。
- 执行引擎:负责将字节码编译成机器可以识别的代码,并执行代码逻辑。
- 运行时数据区:用来存储程序执行期间的数据。提供程序运行时的内存空间,为程序的执行提供基础支持。
五、云原生的JVM
5.1 云原生开发趋势
元原生开发的趋势主要集中在无服务器(Serverless)、容器化、Kubernetes、分布式等。
- 无服务器(Serverless):在云原生下,弱化了服务器的概念,将程序容器化,让开发者解决程序的问题,而不需要考虑基础设施的维护问题。
- 容器化:区别于jvm这种基于开发语言的虚拟机,容器使用的是基于操作系统层面的虚拟化,给每个容器分配对应的资源,允许在容器内运行多个程序和进程。
- Kubernetes:它在容器化部署和资源管理等方面展现的自动化、弹性伸缩和容错能力已经成为了现在架构的基础。
- 分布式、弹性伸缩、微服务架构:
云时代的系统开发需要支持大规模的分布式计算和存储,能有效应对海量数据处理和分析的需要。云计算平台提供了弹性的资源分配机制,应用可以根据业务需求自动伸缩计算资源。系统开发通常采用微服务架构,把系统分解成一组小型、独立的服务,每个服务都在自己的进程中运行,各自独立部署。
5.2 云原生下JVM存在的问题
- 启动时间:jvm在启动的时候需要加载很多框架文件,加上其他的一些中间件的长连接,启动时间将以分钟计。
- 启动性能:在启动的前期jvm都是使用解释器执行代码,运行一段时间后才会使用解释+即时编译段模式,所以启动前期的性能低下。
- 占用内存:
- 面向对象:面向对象占用的内存空间过多,头部header通知占用8个字节,用于存储整数值需要4个字节,但为了对齐用了32字节来存储。
5.3 JVM对云原生的支持
- 对容器化的支持:在jdk 8之前,jvm无法感知容器的资源限制,经常会因为占用内存过大导致容器将进程kill 掉掉情况。而在jdk11 之后jvm增加了对容器资源的识别,可以根据容器的资源配置来合理的分配jvm资源的大小。
- AOT技术:Ahead-Of-Time AOT编译技术,通过在jvm启动之前就把字节码文件编译成机器可识别的机器代码,在jvm启动时无需预热就可以达到最佳的性能。
- 函数式编程支持的增强:基于函数式编程风格更加强调不可变性和无副作用的特性,产生的垃圾更少。
- GraalVM:GraalVM支持AOT编译,这意味着它可以将Java程序编译成本地可执行文件,极大地减少了启动时间和内存占用,更适应在云原生环境下运行。
六、总结
JVM经历了过去辉煌的28年,但在已经来临的云时代,原有的优势面临着新的挑战,为了适应云时代高性能、高可扩展性、高可靠性和高安全性的要求,JVM也在努力地进行自我革新。
总的来说,JVM的发展方向主要包括3个方面。
- 首先是性能优化,通过提高性能和资源利用率来适应云原生时代的需求。其中最主要的技术是AOT编译器和JIT编译器的结合,以及JVM的内存管理和垃圾回收机制的优化。
- 其次是对容器化的支持,通过支持容器化和新的微服务架构以适应云原生时代的需求。其中最主要的技术是JVM的镜像化和容器化以及对容器化环境的适配。
- 最后是安全性和可靠性的提升,通过持续提高安全性和可靠性来适应新时代的要求。