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. 最后是安全性和可靠性的提升,通过持续提高安全性和可靠性来适应新时代的要求。
相关推荐
团子的二进制世界3 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
Max_uuc7 分钟前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
long3168 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
Serene_Dream31 分钟前
JVM 并发 GC - 三色标记
jvm·面试
rannn_11135 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
灵感菇_37 分钟前
Java HashMap全面解析
java·开发语言
qq_124987075339 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日1 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
若鱼19191 小时前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王1 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法