秋招Day11 - JVM - JVM调优

article/2025/9/6 6:50:12

性能监控的命令行工具?

操作系统层面:

  • 我用过top来查看cpu和内存的使用情况
  • 使用过vmstat查看过虚拟内存的统计信息
  • 使用过iostat查看过系统的io情况
  • 使用过netstat查看过系统的网络信息

JDK自带的命令层面,我使用过:

  • jmap -heap pid查看堆内存摘要,包括新生代、老年代和元空间
  • jmap -histo pid查看对象分布统计
  • jmap -dump生成堆转储文件

了解过哪些可视化的性能监控工具?

  • JConsole:JDK自带的监控工具,查看应用程序的运行状态,包括内存使用,线程状态,类加载,GC
  • VisualVM:故障处理工具,集成多个JDK命令行工具的功能
  • Java Mission Control:内存分析,线程分析,历史数据

使用过哪些第三方的工具?

  • MAT:是一个堆内存分析工具,排查内存泄露问题(从堆转储文件中分析),检查对象间的引用关系
  • GChisto:GC日志分析统计工具
  • JProfiler:性能分析工具,CPU,内存、线程实时分析
  • arthas:阿里巴巴的开源工具,用于线上应用诊断,可以进行JVM信息查看,监控
  • async-profiler:低开销的性能分析工具

JVM常见的参数配置

配置堆内存大小:

  • -Xms:初始堆大小
  • -Xmx:最大堆大小
  • -XX:NewSize=n:设置年轻代大小
  • -XX:NewRatio=n:设置年轻代与老年代大小比值
  • -XX:SurvivorRatio=n:设置年轻代与Survivor大小比值

配置GC收集器参数:

  • -XX:+UseSerialGC:配置串行GC器
  • -XX:+UseParallelGC:配置并行GC器
  • -XX:+UseParallelOldGC:配置并行老年代GC器

配置并行收集的参数:

  • -XX:+MaxGCPauseMillis=n:设置最大垃圾回收停顿时间
  • -XX:+GCTimeRadio=n:设置垃圾回收时间占程序运行时间的比例
  • -XX:+ParallelGCThreads=n:设置并行收集器的线程数

打印GC回收过程日志的参数:

  • -XX:+PrintGC:输出GC日志
  • -XX:+PrintGCDetails:输出GC日志详情
  • -XX:+PrintGCTimeStamps:输出GC日志的时间戳
  • -Xloggc:filename:日志文件的输出路径

做过JVM调优吗?

做过,调优的对象包括堆内存垃圾收集器JVM运行时参数

如果堆内存设置过小,可能会导致频繁的垃圾回收。所以在项目中,启动 JVM 的时候配置了 -Xms 和 -Xmx 参数,让堆内存最大可用内存为 2G(我用的丐版服务器)。

在项目运行期间,我会使用 JVisualVM 定期观察和分析 GC 日志,如果发现频繁的 Full GC,我会特意关注一下老年代的使用情况。

接着,通过分析 Heap dump 寻找内存泄漏的源头,看看是否有未关闭的资源长生命周期大对象等。

之后进行代码优化,比如说减少大对象的创建优化数据结构的使用方式减少不必要的对象持有等。

CPU占用过高怎么排查?

首先,使用 top 命令查看 CPU 占用情况,找到占用 CPU 较高的进程 ID。

top

接着,使用 jstack 命令保存对应进程的线程堆栈信息。 

jstack -l <pid> > thread-dump.txt

然后再使用 top -H - p 命令查看进程中线程的占用情况,找到占用 CPU 较高的线程 ID。

top -H -p <pid>

接着在 jstack 的输出搜索这个十六进制的线程 ID,找到对应的堆栈信息。

"Thread-5" #21 prio=5 os_prio=0 tid=0x00007f812c018800 nid=0x1a85 runnable [0x00007f811c000000]java.lang.Thread.State: RUNNABLEat com.example.MyClass.myMethod(MyClass.java:123)at ...

最后,根据堆栈信息定位到具体的业务方法,查看是否有死循环、频繁的垃圾回收、资源竞争导致的上下文频繁切换等问题。

内存飙高问题怎么排查?

第一,先观察垃圾回收的情况,可以通过 jstat -gc PID 1000 查看 GC 次数和时间。

第二步,通过 jmap 命令 dump 出堆内存信息。

第三步,使用可视化工具分析 dump 文件,比如说 VisualVM,找到占用内存高的对象,再找到创建该对象的业务代码位置,从代码和业务场景中定位具体问题。

频繁minor gc怎么解决?

频繁的 Minor GC 通常意味着新生代中的对象频繁地被垃圾回收,可能是因为新生代空间设置的过小,或者是因为程序中存在大量的短生命周期对象(如临时变量)。

可以使用 GC 日志进行分析,查看 GC 的频率和耗时,找到频繁 GC 的原因。

-XX:+PrintGCDetails -Xloggc:gc.log

如果是因为新生代空间不足,可以通过 -Xmn 增加新生代的大小,减缓新生代的填满速度。

java -Xmn256m your-app.jar

频繁full gc怎么办?

频繁的 Full GC 通常意味着老年代中的对象频繁地被垃圾回收,可能是因为老年代空间设置的过小,或者是因为程序中存在大量的长生命周期对象。

查看 GC 的频率和堆内存的使用情况:

# 查看堆内存各区域的使用率以及GC情况
jstat -gcutil -h20 pid 1000
# 查看堆内存中的存活对象,并按空间排序
jmap -histo pid | head -n20
# dump堆内存文件,VisualVM
jmap -dump:format=b,file=heap pid

假如是因为大对象直接分配到老年代导致的 Full GC 频繁,可以通过 -XX:PretenureSizeThreshold 参数设置大对象直接进入老年代的阈值。或者将大对象拆分成小对象,减少大对象的创建。比如说分页。

假如是因为内存泄漏导致的频繁 Full GC,可以通过分析堆内存 dump 文件找到内存泄漏的对象,再找到内存泄漏的代码位置,优化引用释放机制,及时释放资源,比如说 ThreadLocal、数据库连接、IO 资源等。

假如是因为 GC 参数配置不合理导致的频繁 Full GC,可以通过调整 GC 参数来优化 GC 行为。或者直接更换更适合的 GC 收集器,如 G1、ZGC 等。


http://www.hkcw.cn/article/uxHIejnntY.shtml

相关文章

ChatGPT Plus/Pro 订阅教程(支持支付宝)

订阅 ChatGPT Plus GPT-4 最简单&#xff0c;成功率最高的方案 1. 登录 chat.openai.com 依次点击 Login &#xff0c;输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后&#xff0c;点击左下角的 Upgrade to Plus&#xff0c;在弹窗中选择 Upgrade plan。 如果…

【深度学习】12. VIT与GPT 模型与语言生成:从 GPT-1 到 GPT4

VIT与GPT 模型与语言生成&#xff1a;从 GPT-1 到 GPT4 本教程将介绍 GPT 系列模型的发展历程、结构原理、训练方式以及人类反馈强化学习&#xff08;RLHF&#xff09;对生成对齐的改进。内容涵盖 GPT-1、GPT-2、GPT-3、GPT-3.5&#xff08;InstructGPT&#xff09;、ChatGPT …

笔试模拟 day14

观前提醒&#xff1a; 笔试所有系列文章均是记录本人的笔试题思路与代码&#xff0c;从中得到的启发和从别人题解的学习到的地方&#xff0c;所以关于题目的解答&#xff0c;只是以本人能读懂为目标&#xff0c;如果大家觉得看不懂&#xff0c;那是正常的。如果对本文的某些知…

基于照片环境信息的AI定位技术:从原理到实战的深度解析

基于照片环境信息的AI定位技术&#xff1a;从原理到实战的深度解析 摘要 本文聚焦基于照片环境信息的AI定位技术&#xff0c;系统梳理其核心原理、技术实现路径及行业应用场景。结合多模态融合、深度学习优化等前沿技术&#xff0c;分析如何通过AI训练提升定位精度&#xff0c…

NumPy 2.x 完全指南【二十二】数组标量

文章目录 1. 标量&#xff08;Scalar &#xff09;2. 数组标量&#xff08;Array Scalar&#xff09;3. 标量类型3.1 基类3.1.1 generic3.1.2 number3.1.3 flexible 3.2 整数类型3.2.1 有符号整数3.2.2 无符号整数 3.3 不精确类型3.3.1 浮点数3.3.2 复数 3.4 其他类型3.4.1 布尔…

外地车在北京进京证用完后该如何行驶

外地车在北京进京证用完后该如何行驶 这个问题想必非京籍的车友都有这样的困惑吧 作为一名资深外地车主&#xff0c;已在北京漂泊了13年之久&#xff0c;12次进京证的办理根本不够用&#xff0c;也有网友支招说和家人来回过户200搞定&#xff0c;多出12次&#xff0c;奈何这种…

可靠数据传输原理

目录 构造可靠数据传输协议 一、rdt1.0&#xff1a;理想信道下的可靠传输 核心假设与功能 二、rdt 2.0&#xff1a;带差错检测的停等协议 核心假设与功能 三、rdt 2.1&#xff1a;修复 ACK/NAK 不可靠性 核心改进 四、rdt 2.2&#xff1a;纯 ACK 实现的可靠传输 核心改…

JAVA重症监护系统源码 ICU重症监护系统源码 智慧医院重症监护系统源码

智慧医院重症监护系统源码 ICU重症监护系统源码 开发语言&#xff1a;JavaVUE ICU护理记录&#xff1a;实现病人数据的自动采集&#xff0c;实时记录监护过程数据。支持主流厂家的监护仪、呼吸机等床旁数字化设备的数据采集。对接检验检查系统&#xff0c;实现自动化录入。喜…

新版LangChain向量数据库VectorStore设计详解

导读&#xff1a;在大型语言模型与知识库集成的实践中&#xff0c;向量数据库的选择和架构设计往往成为项目成败的关键因素。本文深入剖析了LangChain框架中VectorStore的核心设计理念&#xff0c;为开发者提供了系统性的技术指导和实践方案。 文章揭示了LangChain如何通过抽象…

Transformer架构核心流程解析

Transformer的核心流程 Tokenizer→Embedding→Attention→FFN 1. 文本预处理与分词阶段&#xff08;Tokenizer&#xff09; 分词方式演进 基于单词的分词器&#xff1a;通过空格、标点符号拆分&#xff0c;但词汇表庞大且易出现未知词&#xff08;UNK&#xff09;基于字符…

【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN

【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN 目录 【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-LSTM、Transformer、CNN-LSTM、LSTM、…

美国华盛顿州一公园发生枪击事件 7人受伤

美国华盛顿州一公园在5月28日晚间发生枪击事件,导致7人受伤,其中3人伤势严重。警方表示,目前尚不清楚有多少嫌疑人参与了这起事件,并且截至事发当日,还没有任何人被逮捕。责任编辑:zx0176

RabbitMQ项目实战

先参考文章&#xff1a;&#xff08;必看&#xff09; 06-MQ基础_mq服务-CSDN博客 07-MQ高级&#xff08;幂等性&#xff09;-CSDN博客 https://cloud.iocoder.cn/message-queue/rabbitmq/#_2-0-%E5%BC%95%E5%85%A5%E4%BE%9D%E8%B5%96%E4%B8%8E%E9%85%8D%E7%BD%AE 1、Rabbi…

自动化测试实例:Web登录功能性测试(无验证码)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是自动化测试 把人为驱动的测试行为转化为机器执行的一种过程称为自动化测试。(来自百度百科)本质上来说&#xff0c;自动化测试对比起手工测试除了需…

用 Python 模拟下雨效果

用 Python 模拟下雨效果 雨天别有一番浪漫情怀&#xff1a;淅淅沥沥的雨滴、湿润的空气、朦胧的光影……在屏幕上也能感受下雨的美妙。本文将带你用一份简单的 Python 脚本&#xff0c;手把手实现「下雨效果」动画。文章深入浅出&#xff0c;零基础也能快速上手&#xff0c;完…

[PyTest-案例]

接口对象封装 1.requests和pymysql实现ihrm登录接口缺点 : 代码冗余度高,耦合度高,维护成本大 核心思想 : 代码分层 按代码功能划分 : 接口对象层 : 负责发送http请求,访问待测接口,返回响应数据测试用例层 : 调用接口,按照响应数据,断言完成测试 封装tpshop商城 普通方式…

25 字符数组与字符串及多维数组详解:定义与初始化、访问与遍历、%s 格式符、内存剖析、编程实战

1 字符数组与字符串 1.1 字符数组 字符数组是 C 语言中用于存储一系列字符的基本数据结构。其定义方式与其他类型的数组类似&#xff0c;使用 char 类型来指定数组的元素类型。例如&#xff1a; char arr[10]; // 定义一个可存储 10 个字符的数组 此数组 arr 能够存储 10 个字…

IEEE旗下2区所有SCI汇总!

本期小编统计了【IEEE旗下】2区所有期刊的最新影响因子&#xff0c;分区、年发文量以及投稿经验&#xff0c;供大家参考&#xff01; 1 IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing 【影响因子】4.7 【期刊分区】JCR1区&#xff0c;中…

论文略读: STREAMLINING REDUNDANT LAYERS TO COMPRESS LARGE LANGUAGE MODELS

2025 ICLR 判断模型层的重要性->剪去不重要的层&#xff08;用轻量网络代替&#xff09; 这种方法只减少了层数量&#xff0c;所以可以用常用的方法加载模型 层剪枝阶段 通过输入与输出的余弦相似度来判断各个层的重要性 具有高余弦相似度的层倾向于聚集在一起&#xff0c…

Geoserver修行记--点击geoserver服务的WMTS能力(GetCapabilities)文档显示400 null

项目场景 在进行geoserver的项目部署过程中再次遇到的问题&#xff0c;这里再记录一下&#xff1a; 我在前端调用WMTS服务的时候&#xff0c;我需要查看图层的能力文档&#xff0c;点击下图出现如下所示的情况&#xff1a; 点击以后出现 400&#xff1a;null&#xff0c;如下…