常用调优命令及各种 OOM 的应对策略【JVM调优】

文章目录

    • [1. 常见的调优命令](#1. 常见的调优命令)
    • [2. 常见的性能调优](#2. 常见的性能调优)
    • [3. 常用的调优工具](#3. 常用的调优工具)
    • [4. 各种 OOM 的应对策略](#4. 各种 OOM 的应对策略)
    • [5. 配置垃圾收集器](#5. 配置垃圾收集器)
    • [6. CPU 占用过高](#6. CPU 占用过高)

1. 常见的调优命令

① jps:显示所有虚拟机进程;

② jstack:生成当前线程快照;

③ jmap:生成 dump 堆转储文件;

④ jhat:与 jmap 搭配使用,生成 dump 的分析结果;

⑤ jstat:监控虚拟机运行时的状态信息;

⑥ jinfo:实时查看和调整虚拟机运行参数。

2. 常见的性能调优

① -Xmx:设置堆内存的最大限制;

② -XX:NewSize:设置新生代的大小;

③ -XX:NewRatio:设置新生代和老年代的占比;

④ 设定垃圾回收器,新生代用 -XX:+UseParNewGC,年老代用 -XX:+UseConcMarkSweepGC。

3. 常用的调优工具

① jconsole:是JDK中自带的java监控和管理控制台,用于对JVM中内存、线程和类等的监控;

② jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照、监控内存变化、GC变化等;

③ MAT,它是一个基于Eclipse的内存分析工具,是快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗;

④ GChisto,一款专业分析gc日志的工具。

4. 各种 OOM 的应对策略

(1)堆内存溢出

什么情况呢?就是我们不断地创建对象,并且 GC Roots 到对象之间有可达路径,所以垃圾回收器并不会回收这些对象,当堆中对象的数量超过最大堆容量限制后,发生内存溢出。

出现这种异常,我们需要把堆快照文件 dump 下来进行单独分析。然后判断内存中的对象是否有存在的必要,也就是说这是内存泄漏还是内存溢出?

如果是内存泄漏,可通过工具查看它的引用链,分析是什么原因导致无用对象长期被引用着,然后修改业务代码;如果是内存溢出,考虑重新设置虚拟机参数(-Xms、-Xmx)。

(2)栈溢出

当应用程序递归太深时容易发生栈溢出。

栈溢出的原因:递归太深、大量循环、死循环或全局变量过多等。

(3)运行时常量池溢出

由于常量池分配在方法区内,我们可以通过 -XX:PermSize 和 -XX:MaxPermSize 限制方法区的大小,从而间接限制其中常量池的容量。

(4)方法区溢出

检查一下某些类是不是没有做缓存,导致频繁地加载生成,修改业务代码改进。如果类加载正常,那我们可以通过 -XX:PermSize 和 -XX:MaxPermSize 来限制方法区的大小。

5. 配置垃圾收集器

① 首先是内存大小的问题,给每一个内存区域都设置一个上限,比如堆空间会设置成操作系统的 2/3;

② 接下来进行初步优化,根据情况,合理设置新生代和老年代的比例;

③ 专项优化,优化依据是系统容量、吞吐量、访问延迟等,由于是高并发环境下,所以 STW 的时间应该被高度重视;

④ 借用日志分析工具,快速定位到具体的问题。

6. CPU 占用过高

首先使用 top -Hp 命令,可查看是哪个线程占用的 CPU 最高,然后使用 jstack 命令找到具体的线程。

如果是业务线程,就去找是哪个方法导致 CPU 高占用的;如果是 GC 线程,那么一定是频繁的 GC 造成 CPU 高涨,这时候就要去读日志找原因了,可以使用日志分析工具 GChisto。

相关推荐
Access开发易登软件8 小时前
Access 和 SQLite,根本不在一个赛道上
java·jvm·数据库·sqlite·excel·vba·access开发
枫叶林FYL11 小时前
项目十:事件溯源仓储管理系统(WMS)
jvm·数据库·oracle
小江的记录本12 小时前
【JVM虚拟机】垃圾回收GC:垃圾判定算法:引用计数法、可达性分析算法(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·spring·面试
Byron__12 小时前
JVM垃圾回收与调优核心面试笔记(引用计数/GC算法/CMS/G1/参数调优)
java·jvm·笔记·面试
jameslogo12 小时前
JVM入门
jvm
一只小白00014 小时前
【JVM | 第一篇】—— JVM内存区域详解
jvm
huohaiyu15 小时前
深入解析JVM核心原理与运行机制
运维·服务器·jvm
思麟呀17 小时前
在C++基础上理解CSharp-4
开发语言·jvm·c++·c#
颖火虫盟主17 小时前
Conan C++ 包管理工具深度解析
java·jvm·c++
tongluowan0071 天前
jvm垃圾回收器 - CMS-已弃用的垃圾回收器
jvm·cms·垃圾回收器