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. 最后是安全性和可靠性的提升,通过持续提高安全性和可靠性来适应新时代的要求。
相关推荐
真实的菜几秒前
消息队列处理模式:流式与批处理的艺术
java
盖世英雄酱5813616 分钟前
Java 内存管理技巧(新手必看集合篇)
java
~plus~17 分钟前
Harmony核心:动态方法修补与.NET游戏Mod开发
开发语言·jvm·经验分享·后端·程序人生·c#
码农小灰18 分钟前
Java 8 Stream API 入门到实践详解
java·java案例
步、步、为营23 分钟前
.NET 事件模式举例介绍
java·开发语言·.net
cui_hao_nan26 分钟前
设计模式——模板方法
java·设计模式
小吕学编程26 分钟前
HttpServletRequest常用方法
java·http
在未来等你27 分钟前
Java并发编程实战 Day 11:并发设计模式
java·设计模式·多线程·并发编程·threadlocal·生产者消费者·读写锁
李少兄39 分钟前
解决 idea提示`SQL dialect is not configured` 问题
java·sql·intellij-idea
BreezeDove1 小时前
IDEA安装&迁移IDEA配置数据位置
java·ide·intellij-idea