JVM 深入理解与性能优化

devtools/2025/2/26 3:05:58/

JVM(Java Virtual Machine,Java 虚拟机)是 Java 代码运行的核心,它负责 内存管理、类加载、字节码执行、垃圾回收(GC)和 JIT 编译。理解 JVM 有助于优化 Java 应用的性能,提高调试和排错能力。

内存管理

JVM 在运行时会将内存划分成不同的区域,每个区域有不同的作用:

注:图片来自于网络

  • 方法区(Metaspace):存储类元数据(方法、字段、常量池等)。

  • 堆(Heap):存储对象实例,GC 主要管理的区域,分为 新生代(Eden、S0、S1)老年代

  • 虚拟机栈(Stack):存储方法调用的局部变量、操作数栈、方法返回地址。

  • 本地方法栈(Native Stack):用于执行 JNI(Java Native Interface)方法。

  • 程序计数器(PC Register):记录当前执行的字节码指令地址。

🌟 实战案例:栈溢出
java">public class StackOverflowDemo {public static void recursiveMethod() {recursiveMethod(); // 无限递归,导致栈溢出}public static void main(String[] args) {recursiveMethod();}
}

运行后会抛出 **java.lang.StackOverflowError**,因为栈空间被耗尽。

类加载机制

JVM 通过 类加载器(ClassLoader) 加载 .class 文件到内存。

类加载过程

注:图片来自于网络

  1. 加载(Loading):从文件或网络加载字节码。

  2. 验证(Verification):检查字节码格式和安全性。

  3. 准备(Preparation):为类的静态变量分配内存并初始化默认值。

  4. 解析(Resolution):解析符号引用。

  5. 初始化(Initialization):执行 <clinit> 静态代码块。

双亲委派机制

注:图片来自于网络

  • BootstrapClassLoader(加载核心类,如 java.lang.*

  • ExtClassLoader(加载 ext 目录的扩展类)

  • AppClassLoader(加载 classpath 下的类)

  • 自定义 ClassLoader(可以破坏双亲委派机制)

🌟 实战案例:自定义类加载器
java">import java.io.*;
​
public class MyClassLoader extends ClassLoader {@Overridepublic Class<?> findClass(String name) throws ClassNotFoundException {byte[] bytes = loadClassData(name);return defineClass(name, bytes, 0, bytes.length);}private byte[] loadClassData(String name) {try (InputStream input = new FileInputStream(name + ".class")) {ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = input.read(buffer)) != -1) {output.write(buffer, 0, bytesRead);}return output.toByteArray();} catch (IOException e) {throw new RuntimeException(e);}}
}

JVM 垃圾回收(GC)机制

JVM 通过 GC 自动管理对象的内存回收,常见 GC 方式:

  • Minor GC(年轻代回收)

  • Major GC(Full GC)(老年代回收)

垃圾回收算法
  • 标记-清除(Mark-Sweep):标记不可达对象并回收。

  • 复制(Copying):将存活对象复制到新空间,适用于新生代。

  • 标记-整理(Mark-Compact):回收对象并整理内存,适用于老年代。

常见垃圾回收器
GC 类型适用场景说明
Serial GC小型应用单线程
Parallel GC高吞吐量多线程
CMS GC低延迟应用并发回收
G1 GC大内存低停顿
🌟 实战案例:GC 日志分析
java -XX:+PrintGCDetails -Xms100M -Xmx100M -XX:+UseG1GC MyApplication

JIT(Just-In-Time)编译优化

JVM 采用 JIT(即时编译) 优化代码执行。

  • C1 编译器:轻量级优化,适用于客户端模式。

  • C2 编译器:高性能优化,适用于服务器模式。

  • 逃逸分析(Escape Analysis)

    • 栈上分配(减少堆内存使用)

    • 标量替换(减少对象创建)

JVM 调优与性能优化

JVM 监控工具
  • jps:查看 JVM 进程

  • jmap:查看内存快照

  • jstack:查看线程栈

  • VisualVM:可视化 JVM 监控工具

JVM 常用调优参数
-XX:+PrintGCDetails -Xms512m -Xmx1024m -XX:+UseG1GC

实战+总结

🌟 JVM 调优案例
java -Xms512m -Xmx1g -XX:+UseG1GC -XX:+PrintGCDetails MyApplication

观察 GC 运行情况,调整参数优化性能。

📌 总结
  1. 内存管理:JVM 运行时分为 堆、方法区、栈、本地方法栈、程序计数器

  2. 类加载机制:包括 类加载过程和双亲委派

  3. 垃圾回收(GC):JVM 通过 GC Roots 进行 可达性分析,采用不同 GC 算法和回收器

  4. JIT 编译:即时编译优化 Java 代码,提高执行效率。

  5. JVM 调优:使用 VisualVMjstat 监控,优化 GC 参数。


http://www.ppmy.cn/devtools/162710.html

相关文章

steam_api.dll丢失3分钟修复指南,解决Steam游戏无法运行

你是不是刚下载好 Steam 游戏&#xff0c;激动双击图标&#xff0c;结果弹出一句 “steam_api.dll 没有被指定在 windows 上运行”&#xff1f;本文提供 3 种安全修复方案&#xff0c;详解 steam_api.dll 文件下载避坑技巧 正确存放路径&#xff0c;推荐一键修复工具&#xff…

【够用就好006】-PC桌面管理ECS服务器的实操步骤

背景介绍解决思路拓展知识 背景介绍 #够用就好#知其然知其所以然#aigc创意人左边 我计划搭建个人网站&#xff0c;计划格式化我的ECS服务器&#xff0c;但是里面有我之前的实践项目&#xff0c;我舍不得删除&#xff0c;我想要保存到本地。 通常我都是在vscode中用remotes ssh…

图数据库Neo4j面试内容整理-约束(Constraint)

约束(Constraint) 是数据库中用于确保数据一致性和完整性的一种机制。它限制了数据的某些方面,确保特定条件得到满足。在 Neo4j 中,约束主要用于确保图数据的一致性,防止插入不符合规则的数据。约束通常与索引一起使用,但它们的功能和目的有所不同。 1. Neo4j 中的约束类…

深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客Y1中的内容 &#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 ** 注意该训练营出现故意不退押金&#xff0c;恶意揣测偷懒用假的结果冒充真实打卡记录&#xff0c;在提出能够拿到视频录像…

鸿蒙-自定义相机拍照

文章目录 前言大致流程开发权限处理获取可用相机列表创建相机输入流并打开相机创建并配置会话拍照回调和启动会话其他配置闪光灯连续自动对焦缩放 释放资源优化设备旋转在 Worker 线程中使用相机 前言 这个就没啥好说的&#xff0c;有需求就要搞定需求&#xff0c;搞不定需求就…

解决idea一个非常坑的问题

dea中经常会遇到这样问题&#xff0c;明明maven的pom中已经添加了依赖&#xff0c;总是提示jar包找不到&#xff0c; 于是双击clean &#xff0c;或者 点击 reload maven &#xff0c;都是不好使。如 javax.crypto.spec.IvParameterSpec;这个包&#xff0c;竟然飘红了。我clean…

ArcGIS Pro制作人口三维地图教程

数据可视化是现代数据分析领域的一项重要技术&#xff0c;它通过图表、地图等视觉形式将数据转化为易于理解的信息&#xff0c;使得人们能够更直观地把握数据的内涵与趋势。 在众多可视化手段中&#xff0c;三维地图因其能够展现数据在空间中的立体分布而备受青睐。 本文将详…

git中的merge和rebase的区别

在 Git 中&#xff0c;git merge 和 git rebase 都是用于整合分支变更的核心命令&#xff0c;但它们的实现方式和结果有本质区别。以下是两者的详细对比&#xff1a; 一、核心区别 特性git mergegit rebase历史记录保留分支拓扑&#xff0c;生成新的合并提交线性化历史&#x…