Java学习篇之JVM 调优

Java学习篇之JVM 调优

  • 一、JVM 是什么?
  • 二、JVM 官方参数建议
  • 三、JVM调优的场景
  • 四、如何监控JVM
  • 五、JVM调优的流程步骤
    • 1. 明确优化目标
    • 2. 监控和分析
    • 3. 确定调优参数
    • 4. 实施调优策略
    • 5. 持续观察和调整
    • 6. 定期评估和优化

一、JVM 是什么?

JVM,全称Java Virtual Machine(Java虚拟机),是一个能够运行Java字节码的抽象计算机。
JVM是Java跨平台特性的核心。Java源代码在编译成字节码后,可以在任何支持Java的平台上运行,只要该平台安装了相应的JVM。这是因为JVM将Java字节码转换成特定平台上的机器码来执行,从而实现了“一次编写,到处运行”的跨平台特性。

二、JVM 官方参数建议

JVM 经过这么多年的发展和验证,整体是非常健壮的。个人认为99%的情况下,基本用不到 JVM 调优。
通常来说,我们的 JVM 参数配置大多还是会遵循 JVM 官方的建议,例如:

1. 堆内存设置

参数描述官方建议/说明
-Xms设置JVM的初始堆大小默认为物理内存(运行内存)的1/64;对于高并发应用,建议与-Xmx相同
-Xmx设置JVM的最大堆大小默认为物理内存(运行内存)的1/4
-Xmn设置年轻代的初始和最大大小默认为整个堆的3/8;或使用-XX:NewSize/-XX:MaxNewSize分别设置

2. 年轻代与老年代比例

参数描述官方建议/说明
-XX:NewRatio设置年轻代与老年代的比例默认值为2(即老年代是年轻代的2倍)
-XX:SurvivorRatio设置Eden区与一个Survivor区的大小比例默认值为8,表示Eden区与Survivor区的比例为8:1

3. 线程堆栈设置

参数描述官方建议/说明
-Xss设置每个线程的堆栈大小JDK5.0后默认1MB;小型应用可能128KB足够,大型应用建议256KB

4. 非堆内存设置

参数描述官方建议/说明
-XX:PermSize设置持久代的初始大小(JDK8已弃用)JDK8前用于控制方法区内存大小
-XX:MaxPermSize设置持久代的最大大小(JDK8已弃用)JDK8前用于控制方法区内存大小
-XX:MetaspaceSize设置元空间的初始大小(JDK8及以后)替代了PermSize,用于存放类的元数据
-XX:MaxMetaspaceSize设置元空间的最大大小(JDK8及以后)替代了MaxPermSize

5. 垃圾收集器设置

参数描述官方建议/说明
-XX:+UseSerialGC使用串行垃圾收集器默认GC方式,适用于小型应用和单处理器环境
-XX:+UseParNewGC在年轻代中使用并行线程进行垃圾收集可以与CMS GC一起使用
-XX:+UseParallelGC在年轻代中使用并行垃圾收集器适用于多处理器系统
-XX:+UseParallelOldGC在老年代中使用并行垃圾收集器与-XX:+UseParallelGC一起使用
-XX:+UseConcMarkSweepGC使用CMS垃圾收集器在GC运行时对应用程序影响较小

6. 辅助信息设置

参数描述官方建议/说明
-XX:+PrintGCDetails打印垃圾收集的详细情况用于调试和性能分析
-Xloggc:filename将GC日志信息记录到指定文件便于分析和监控JVM的垃圾回收行为

7. 其他重要参数

参数描述官方建议/说明
-XX:MinHeapFreeRatio设置GC事件后允许的最小可用堆空间百分比控制JVM何时扩展堆大小
-XX:MaxHeapFreeRatio设置GC事件后允许的最大可用堆空间百分比控制JVM何时收缩堆大小
-XX:MaxDirectMemorySize设置Direct ByteBuffer分配的堆外内存的最大大小当达到此大小时,将触发Full GC

请注意,这些建议是基于Oracle JDK的通用指南,并且可能会随着JVM版本的更新而有所变化。
在实际应用中,可能还需要根据具体的应用场景、硬件环境和性能需求进行进一步的调整和优化。
同时,也需要注意参数的兼容性和稳定性问题。

三、JVM调优的场景

主要就是出现以下情况时,就需要注意对JVM进行调优了

  1. 当应用程序运行缓慢或出现卡顿,或是偶尔响应慢
  2. 应用程序频繁出现内存溢出(OutOfMemoryError)或内存泄漏等问题,

四、如何监控JVM

JVM监控工具分为JDK自带工具和第三方工具两大类。

  • JDK自带工具(常用的):jconsole、visualvm
  • 第三方工具(常用的):JProfiler、YourKit

JDK自带工具常用命令:

  • jstack pid: 打印堆栈相关执行信息,可以用于死锁发现。
  • jinfo pid: 打印进程的启动详细参数、JVM正在使用的参数。
  • jstat -gc pid: 打印各个分代的内存使用情况。可以每个一段时间打印一次。
  • visualvm: windows图形化界面,不常用。上线之前内测可以使用
  • jmap: 如果内存特别大,jmap会导致线程的停止,所以线上不能使用
    线上时不能dump下来文件,因为文件可能很大(堆内存占了多少文件就有多大),dump时java程序会暂停,线上不能dump。
    jmap -histo pid | head -n 20 :查找有多少对象产生,及对象占用的内存,对象的名称。可用于内存泄露导致的OOM。

五、JVM调优的流程步骤

JVM调优流程步骤可以归纳为以下几点:

1. 明确优化目标

在开始调优之前,首先需要明确优化的目标。这包括响应时间、吞吐量、内存使用率等指标。明确目标后,可以更有针对性地进行调优。

2. 监控和分析

  1. 使用监控工具:利用Java VisualVM、JConsole、JProfiler等监控工具,分析CPU使用率、内存使用情况和垃圾回收频率等指标。

JDK自带工具常用命令:

  • jstack pid: 打印堆栈相关执行信息,可以用于死锁发现。
  • jinfo pid: 打印进程的启动详细参数、JVM正在使用的参数。
  • jstat -gc pid: 打印各个分代的内存使用情况。可以每个一段时间打印一次。
  • jvisualvm: windows图形化界面,不常用。上线之前内测可以使用
  • jmap: 如果内存特别大,jmap会导致线程的停止,所以线上不能使用
    线上时不能dump下来文件,因为文件可能很大(堆内存占了多少文件就有多大),dump时java程序会暂停,线上不能dump。
    jmap -histo pid | head -n 20 :查找有多少对象产生,及对象占用的内存,对象的名称。可用于内存泄露导致的OOM。
  1. 分析GC日志:通过GC日志,了解垃圾回收的频率、停顿时间以及内存使用情况,帮助定位性能瓶颈。

例如:

-Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps

这些选项将GC日志记录到指定的文件(/path/to/gc.log),并打印详细的GC信息和时间戳。

然后,我们可以分析GC日志以了解垃圾回收的频率、停顿时间和内存使用情况。例如,我们可以查>找Full GC的发生频率和每次Full GC的停顿时间。

3. 确定调优参数

根据监控和分析的结果,确定需要调整的JVM参数。常见的JVM参数包括:

  1. 堆内存设置:通过-Xms和-Xmx设置初始和最大堆内存大小。

例如:

-Xms512m -Xmx512m

这将初始堆内存设置为512m,最大堆内存设置为512m。两者最好一致

  1. 垃圾收集器选择:选择合适的垃圾收集器,如G1、CMS等,以优化内存管理。

例如:
选择G1垃圾收集器:以优化内存管理和减少停顿时间。

-XX:+UseG1GC

调整G1垃圾收集器的参数:以进一步优化性能。

-XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=35

这将G1垃圾收集器的目标停顿时间设置为200毫秒,并将触发并发GC的堆占用百分比设置为35%。

  1. 线程栈大小:通过-Xss设置每个线程的堆栈大小,以减少线程上下文切换的开销。

4. 实施调优策略

  1. 调整JVM参数:根据确定的调优参数,调整JVM的启动参数。

例如:如果我们在Linux系统上使用java命令启动应用程序,我们可以这样设置:

java -Xms512m -Xmx512m -Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=35 -jar myapp.jar
  1. 优化代码:减少不必要的对象创建、使用高效的数据结构、避免过度的同步等,都可以显著提升应用的性能。

5. 持续观察和调整

  1. 持续监控:在调整参数和优化代码后,使用监控工具持续观察应用的性能变化。
  2. 对比性能指标:通过对比调优前后的性能指标,确认是否达到了预期的优化目标。
  3. 重新评估和调整:如果没有达到目标,可能需要重新评估调优策略,进行进一步的调整。

6. 定期评估和优化

性能调优是一个持续的过程。随着应用的演变和用户负载的变化,可能需要定期重新评估和调整JVM参数。定期的性能测试和监控可以帮助及时发现潜在问题,确保系统的稳定性和高效性。

参考文章
【1】面试官:如何进行 JVM 调优(附真实案例)
【2】【JVM】JVM 实战调优指南赋案例(保姆篇)
【3】JVM调优实例记录
【4】【Java】JVM调优操作手册(实战篇)
【5】JVM性能优化实战手册:从监控到调优策略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/6659.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA基础:多重循环、方法、递归 (习题笔记)

一&#xff0c;编码题 1.打印九九乘法表 import java.util.*;public class PanTi {public static void main(String[] args) {Scanner input new Scanner(System.in);for (int i 0; i < 9; i) {//i控制行数/* System.out.println("。\t。\t。\t。\t。\t。\t。\t。\…

小林渗透入门:burpsuite+proxifier抓取小程序流量

目录 前提&#xff1a; 代理&#xff1a; proxifier&#xff1a; 步骤&#xff1a; bp证书安装 bp设置代理端口&#xff1a; proxifier设置规则&#xff1a; proxifier应用规则&#xff1a; 结果&#xff1a; 前提&#xff1a; 在介绍这两个工具具体实现方法之前&#xff0…

[笔记] Centos7 安装 Docker 和 Docker Compose 及 Docker 命令大全

Docker 和 Docker Compose 是相辅相成的工具&#xff0c;它们共同提供了一个强大的容器化解决方案。Docker 提供了容器化的基础功能&#xff0c;而 Docker Compose 则提供了更高级的编排和管理能力&#xff0c;使得部署和管理多个容器变得更加容易和高效。 Docker&#xff1a;…

el-message 同时弹出多个【改写el-message】

因为服务断开了 但是拦截器里对每个失败的接口都做了message弹出&#xff0c;因此改写el-message逻辑&#xff0c;仅展示一个同等类型的message窗体 1. 新建 /utils/rewriteElMessage.js /*** Event 解决 el-message 同类型重复打开的问题* description:* author: mhf* time:…

SSM宿舍管理系统-计算机毕业设计源码03732

目 录 1 绪论 1.1研究背景 1.2开发现状 1.3研究内容 1.4论文结构与章节安排 2 宿舍管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 …

淘宝商品描述,一键“爬”回家 —— Java爬虫的奇妙冒险

引言&#xff1a; 在这个信息爆炸的时代&#xff0c;我们每天都在被各种商品信息轰炸。你是否曾想过&#xff0c;如何能快速、准确地获取淘宝商品的描述信息&#xff1f;今天&#xff0c;就让我们一起开启一段Java爬虫的奇妙冒险&#xff0c;探索如何通过代码一键“爬”取淘宝…

线性代数:Matrix2x2和Matrix3x3

今天整理自己的框架代码&#xff0c;将Matrix2x2和Matrix3x3给扩展了一下&#xff0c;发现网上unity数学计算相关挺少的&#xff0c;所以记录一下。 首先扩展Matrix2x2&#xff1a; using System.Collections; using System.Collections.Generic; using Unity.Mathemati…

windows在两台机器上测试 MySQL 集群实现实时备份

在两台机器上测试 MySQL 集群实现实时备份的基本步骤&#xff1a; 一、环境准备 机器配置 确保两台机器&#xff08;假设为服务器 A 和服务器 B&#xff09;能够互相通信&#xff0c;例如它们在同一个局域网内&#xff0c;并且开放了 MySQL 通信所需的端口&#xff08;默认是 …

【stm32】RTC时钟的介绍与使用

RTC时钟的介绍与使用 一、时间戳1、Unix时间戳2、UTC/GMT3、时间戳转换 二、BKP简介及代码编写1、BKP简介2、BKP基本结构3、BKP库函数介绍&#xff1a;4、程序编写&#xff1a; 三、RTC简介及代码编写1、RTC简介2、RTC框图2、RTC基本结构3、RTC相关库函数介绍&#xff1a;4、程…

界面控件DevExpress JS ASP.NET Core v24.1亮点 - 支持Angular 18

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

如何检索 LINEMOD 数据集的相机内参

简介 BOP (Benchmark for 6D Object Pose Estimation) 是一个专为6D物体姿态估计而设计的基准测试平台。它为研究人员提供了多种数据集&#xff0c;以帮助评估和比较物体识别和姿态估计算法的性能。官方网站是 BOP&#xff0c;你可以在这里找到丰富的资源和信息。 检索 LINEM…

机器学习与数据挖掘_使用梯度下降法训练线性回归模型

目录 实验内容 实验步骤 1. 导入必要的库 2. 加载数据并绘制散点图 3. 设置模型的超参数 4. 实现梯度下降算法 5. 打印训练后的参数和损失值 6. 绘制损失函数随迭代次数的变化图 7. 绘制线性回归拟合曲线 8. 基于训练好的模型进行新样本预测 实验代码 实验结果 实验…

web——sqliabs靶场——第一关

今天开始搞这个靶场&#xff0c;从小白开始一点点学习,加油&#xff01;&#xff01;&#xff01;&#xff01; 1.搭建靶场 注意点&#xff1a;1.php的版本问题&#xff0c;要用老版本 2.小p要先改数据库的密码&#xff0c;否则一直显示链接不上数据库 2.第一道题&#xff0…

Xamarin 实现播放视频 MP4

我的想法是在App启动时播放一段视频&#xff0c;实现方式如下&#xff1a; 准备一个视频&#xff1a; Logo.mp4 添加到资源中&#xff1a;Assets 然后将资源设置为 AndroidAsset 启动时&#xff0c;将资源文件拷贝到程序目录的files下&#xff1a; protected override void On…

4070显卡只要一毛钱?这个双十一太疯狂了

2024年双十一大战正酣&#xff0c;各大商家使尽浑身解数&#xff0c;奇招频出&#xff0c;真是让人看得目瞪口呆。每日口令红包、攒火力值领裂变红包、限时抢免定金红包……还有各类满减和打折优惠活动&#xff0c;玩法千奇百怪&#xff0c;算来算去索性放弃&#xff0c;真是没…

C++优选算法四 前缀和

前缀和算法是一种常用的优化技术&#xff0c;主要用于加速某些涉及连续子数组或子序列求和的问题。 一、定义与原理 定义&#xff1a;前缀和是指数组中某个位置之前&#xff08;包括该位置&#xff09;所有元素的和。前缀和算法则是通过提前计算并存储这些前缀和&#xff0c;…

yum安装指定版本Redis

一&#xff0c;yum安装Redis 1&#xff0c;列出可用的redis版本 yum --showduplicates list redis 只有5.0.3.5版本&#xff0c;如果已经满足需求&#xff0c;可以直接安装 2&#xff0c;安装redis yum -y install 如果显示installed&#xff0c; 说明安装成功了 也可以通过…

DAY21|二叉树Part08|LeetCode: 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 LeetCode: 669. 修剪二叉搜索树 基本思路 C代码 LeetCode: 108.将有序数组转换为二叉搜索树 基本思路 C代码 LeetCode: 538.把二叉搜索树转换为累加树 基本思路 C代码 LeetCode: 669. 修剪二叉搜索树 力扣代码链接 文字讲解&#xff1a;LeetCode: 669. 修剪二叉搜…

HarmonyOS基础:鸿蒙系统组件导航Navigation

大家好&#xff01;我是黑臂麒麟&#xff08;起名原因&#xff1a;一个出生全右臂自带纹身的高质量程序员&#x1f60f;&#xff09;&#xff0c;也是一位6&#xff08;约2个半坤年&#xff09;的前端&#xff1b; 学习如像练武功一样&#xff0c;理论和实践要相结合&#xff0…

​Houdini云渲染如何使用?如何让一个镜头使用成百上千台机器渲染,提高渲染效率

​Houdini云渲染如何使用&#xff1f;如何让一个镜头使用成百上千台机器渲染&#xff0c;提高渲染效率呢&#xff0c;最简单的教程来了&#xff01; 第一步&#xff1a;云渲码6666注册成都渲染101&#xff0c;并且下载渲染101客户端 客户端是上传下载的工具&#xff0c;将文件…