news 2026/7/2 2:35:38

JVM虚拟机(Java Virtual Machine)概览

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JVM虚拟机(Java Virtual Machine)概览

Java虚拟机(JVM)是一个可以执行Java字节码虚拟计算机

是Java平台的核心组件,实现了Java跨平台运行的特性。

一、JVM架构

JVM主要分为以下几个子系统:

  • 类加载器Class Loader:加载.class文件
  • 运行时数据区 Runtime Data Areas:包括程序计数器、JVM栈、本地方法栈、堆、方法区等。
  • 执行引擎 Execution Engine:包括解释器、即时编译器JIT、垃圾回收器GC
  • 本地方法接口JNI:用于调用本地库。
  • 本地方法库:由C/C++编写的库。

(一)类加载器Class Loader

1.类加载器分类

  • 引导类加载器 Bootstrap ClassLoader:加载核心Java类库(rt.jar)
  • 扩展类加载器 Extension ClassLoader:加载ext目录下的类
  • 应用类加载器 Application ClassLoader:加载用户类路径上的类
  • 自定义类加载器:用户自定义的类加载器

2.类加载过程

  • 加载(Loading):通过类名获取类的二进制流,将静态存储结构转化为方法区的运行时数据结构,并生成一个class对象。
  • 验证(Verification):确保类文件格式正确
  • 准备(Preparation):为静态变量分配内存并设置初始值
  • 解析(Resolution):将符号引用转为直接引用
  • 初始化(Initialization):执行类构造器<clinit>()方法,为静态变量赋实际值

3.双亲委派模型

一个类加载器在加载类时,首先委托给父类加载器,只有当父类加载器无法完成时,才自己加载。

(二)运行时数据区 Runtime Data Areas

  • 程序计数器 PC Register:线程私有,线程当前所要执行的字节码指令的地址。
  • Java虚拟机栈 JVM Stack:线程私有,存储栈帧(栈帧存储局部变量表、操作数栈、动态链接、方法出口),为Java方法服务。
  • 本地方法栈 Native Method Stack:为本地方法服务。
  • Java堆 Heap:所有线程共享,存放对象实例
  • 方法区 Method Area:所有线程共享,存储类信息、常量、静态变量
  • 运行时常量池:方法区的一部分,存放编译器生成的字面量和符号引用

1.堆的内存结构(JDK8+)

堆(Heap) ├── 新生代(Young Generation,1/3堆空间) │ ├── Eden区(8/10) │ ├── Survivor0区(1/10) │ └── Survivor1区(1/10) └── 老年代(Old Generation,2/3堆空间) 元空间(Metaspace):取代永久代,使用本地内存

2.内存区域(示例)

// 内存区域示例 public class MemoryExample { private static int staticVar = 0; // 方法区 private int instanceVar = 0; // 堆 public void method() { int localVar = 0; // 栈帧中的局部变量表 Object obj = new Object(); // 对象在堆中,引用在栈中 } }

(三)执行引擎 Execution Engine

  • 解释器(直译机):将高级编程语言一行一行直接转译运行,每次运行都要先转为另一种语言再运行(逐行解释字节码)。
  • JIT编译器(Just-in-time Compiler):在程序运行时将字节码实时编译本地机器码动态编译技术(将热点代码编译成本地机器码)。
  • 垃圾回收器(garbage Collector)自动内存管理的组件,负责回收不再使用的对象以释放堆内存。

1.垃圾回收器GC

(1)对象存活判断
  • 引用计数法
  • 可达性分析
(2)垃圾回收算法
  • 标记-清除
  • 复制算法(用于新生代)
  • 标记-整理(用于老年代)
  • 分代收集
(3)垃圾回收器:
  • Serial收集器:单线程的新代收集器,适合单核环境或小型应用程序
  • Parallel收集器:并行收集器,吞吐量优先
  • CMS收集器:并发标记清除收集器,减少停顿时间
  • G1收集器:分代收集和Region内存布局,标记整理,可预测停顿时间
  • ZGC:低延迟,通过并发标记、转译和重定位,支持TB级堆内存
  • Shenandoah:低停顿时间,并发整理

二、JVM调优

(一)常用的调优参数

  • 堆内存设置:-Xms(初始堆大小)、-Xmx(最大堆大小)
  • 新生代设置:-Xmn(新生代大小)
  • 永久代/元空间设置:
  1. -XX:PermSize、-XXMaxPerSize(Java7及之前)
  2. -XX:MetaspaceSize、-XX:MaxMetaspaceSize(Java8+)
  • 垃圾回收器选择:-XX:+UseG1GC
  • 打印GC日志:-XX:PrintGCDetails
# 堆内存设置 -Xms2g # 初始堆大小 -Xmx2g # 最大堆大小 -Xmn1g # 新生代大小 # 垃圾收集器选择 -XX:+UseG1GC # 使用G1收集器 -XX:+UseConcMarkSweepGC # 使用CMS收集器 # GC日志 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log # 元空间设置 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m # 其他优化 -XX:+UseCompressedOops # 压缩普通对象指针 -XX:+UseStringDeduplication # 字符串去重

三、JVM监控与诊断工具

(一)命令行工具

  • jps:JVM进程状态工具
  • jstat:JVM统计信息监控
  • jmap:内存映射工具
  • jstack:线程堆栈跟踪工具
  • jinfo:配置信息工具

(二)可视化工具

  • jconsole:Java监控和管理控制台
  • VisualVM:多合一故障处理工具
  • JMC:Java任务控制
  • Arthas:阿里开源的Java诊断工具

四、版本演进

  • Java 7:引入G1收集器(实验性)
  • Java 8:永久代被元空间取代,默认使用Parallel收集器
  • Java 9:G1成为默认收集器,引入模块化系统
  • Java 11:引入ZGC,废除CMS
  • Java 17:LTS版本,性能优化和特性增强
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 8:41:24

掌握GCC 14中的C++26并发原型(仅限早期采用者的内部资料)

第一章&#xff1a;GCC 14 C26 并发支持GCC 14 对即将发布的 C26 标准提供了初步并发支持&#xff0c;标志着现代 C 在多线程与异步编程模型上的进一步演进。这一版本引入了多项关键语言和库特性&#xff0c;旨在简化并发代码的编写、提升性能并增强可组合性。协程的改进与结构…

作者头像 李华
网站建设 2026/7/1 16:05:56

C++未来已来(Clang 17全面支持C++26新特性曝光)

第一章&#xff1a;C26新纪元&#xff1a;Clang 17开启未来编程之门随着C标准的持续演进&#xff0c;C26正逐步勾勒出下一代系统级编程的蓝图。Clang 17作为首批支持C26实验性特性的编译器&#xff0c;标志着开发者正式迈入模块化、并发增强与泛型革命的新纪元。它不仅实现了对…

作者头像 李华
网站建设 2026/7/1 8:23:09

工业自动化中Keil4编程核心要点解析

Keil4&#xff1a;工业自动化嵌入式开发的“老炮儿”为何依然坚挺&#xff1f;在智能制造与工业4.0浪潮席卷全球的今天&#xff0c;PLC、伺服驱动器、HMI终端等设备早已不再是简单的继电器组合。它们背后&#xff0c;是一套高度集成、实时响应、稳定可靠的嵌入式控制系统。而在…

作者头像 李华
网站建设 2026/7/1 12:06:47

Multisim读取用户数据库:手把手教程

让Multisim“活”起来&#xff1a;如何打通用户数据库&#xff0c;实现仿真与企业数据的无缝联动 你有没有遇到过这样的场景&#xff1f; 项目进入关键阶段&#xff0c;原理图刚画完&#xff0c;采购同事却告诉你&#xff1a;“你选的那款LDO已经停产了。” 你一脸懵地打开元…

作者头像 李华
网站建设 2026/7/1 8:23:14

客服话术一致性保障:用LoRA控制生成文本语气与风格

客服话术一致性保障&#xff1a;用LoRA控制生成文本语气与风格 在智能客服系统日益普及的今天&#xff0c;企业面临的不再是“有没有AI”&#xff0c;而是“AI说得对不对、像不像我们的人”。用户拨打客服电话时&#xff0c;期望听到的是专业、一致且符合品牌调性的回应。然而…

作者头像 李华
网站建设 2026/6/13 0:26:39

VB数组索引越界怎么办?从根源到解决一网打尽

在编程实践中&#xff0c;尤其是在使用Visual Basic&#xff08;VB&#xff09;处理数组时&#xff0c;“索引超出了数组界限”是一个常见且恼人的运行时错误。它直接指向程序在尝试访问数组中不存在的位置&#xff0c;这往往源于对数组大小和索引起点的理解偏差或代码逻辑缺陷…

作者头像 李华