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个方面。

  1. 首先是性能优化,通过提高性能和资源利用率来适应云原生时代的需求。其中最主要的技术是AOT编译器和JIT编译器的结合,以及JVM的内存管理和垃圾回收机制的优化。
  2. 其次是对容器化的支持,通过支持容器化和新的微服务架构以适应云原生时代的需求。其中最主要的技术是JVM的镜像化和容器化以及对容器化环境的适配。
  3. 最后是安全性和可靠性的提升,通过持续提高安全性和可靠性来适应新时代的要求。
相关推荐
是姜姜啊!几秒前
服务熔断组件sentinel,监控服务-springboot-admin-ui
java·服务器
qw9494 分钟前
SpringBoot3—场景整合:环境准备
java·后端
秋说7 分钟前
【Java开发指南 | 第三十五篇】Maven + Tomcat Web应用程序搭建
java·tomcat·maven
我命由我1234510 分钟前
Java Maven 项目问题:com.diogonunes:JColor:jar:5.5.1 was not found in...
java·开发语言·java-ee·maven·intellij-idea·jar·intellij idea
是一个Bug10 分钟前
避免魔法值和多层if的关键:编程范式和设计模式
java·设计模式·log4j
Goober Airy1 小时前
PHP:无框架、不配置服务器,仅利用URL规则设置路由
android·java·服务器·php
阿亮 sir2 小时前
JVM详解
jvm
八股文领域大手子2 小时前
责任链模式+策略模式在项目中的实践
java·数据库·redis·sql·mysql
亥时科技3 小时前
园区环境数字化管理系统(源码+文档+讲解+演示)
java·数据库·开源·源代码管理
Forget the Dream4 小时前
设计模式之中介者模式
java·c++·设计模式·中介者模式