JVM 调优笔记

1.JVM 调优的参数可以在哪里设置参数值?

  1. 命令行启动参数
    最常见的方式是在启动 Java 程序时,通过命令行传入参数设置。例如:
java -Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar myapp.jar
  1. 脚本文件中设置(如 shell/batch 脚本)

        在生产环境中,通常会通过脚本启动 Java 程序,可以在脚本中设置参数:        

JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
java $JAVA_OPTS -jar myapp.jar

        3.IDE 中设置(开发环境)

                在开发环境下,可以通过 IDE(如 IntelliJ IDEA 或 Eclipse)设置:

                        IntelliJ IDEA:

                                进入 Run -> Edit Configurations

                                在 VM options 输入 JVM 参数

2.用的 JVM 调优的参数都有哪些?

一、内存相关参数

参数

含义

-Xms

初始堆大小(如:-Xms512m

-Xmx

最大堆大小(如:-Xmx2g

-Xmn

新生代大小(适用于串行、并行 GC)

-XX:MaxMetaspaceSize=

最大元空间大小(JDK 8+ 替代 PermGen)

-XX:MetaspaceSize=

初始元空间大小

-Xss

每个线程的栈大小(如:-Xss512k

-XX:CompressedClassSpaceSize=

压缩类空间大小(仅适用于 64 位 JVM)

二、垃圾回收(GC)相关参数

  1. 选择垃圾收集器

参数

说明

-XX:+UseSerialGC

使用串行收集器(适用于小内存)

-XX:+UseParallelGC

使用并行收集器(吞吐量优先)

-XX:+UseConcMarkSweepGC

CMS 收集器(低延迟,JDK 9 起弃用)

-XX:+UseG1GC

G1 收集器(推荐用于服务端,JDK 9 默认)

-XX:+UseZGC

ZGC(JDK 11+,低延迟)

-XX:+UseShenandoahGC

Shenandoah(JDK 12+,低停顿)

  1. GC 行为调节

参数

说明

-XX:MaxGCPauseMillis=

设置最大 GC 停顿时间(G1 特有)

-XX:InitiatingHeapOccupancyPercent=

触发 GC 的堆使用阈值(默认 45)

-XX:+PrintGCDetails

打印 GC 详情

-XX:+PrintGCDateStamps

打印 GC 发生的时间戳

-Xlog:gc*

JDK 9+ 标准 GC 日志格式

-XX:+UseStringDeduplication

开启字符串去重(G1 GC 特有)

三、JIT(即时编译器)调优参数

参数

含义

-XX:+TieredCompilation

开启分层编译(默认开启)

-XX:CompileThreshold=

设置方法调用次数阈值,超出后编译为本地代码

-XX:+PrintCompilation

打印 JIT 编译的类和方法

-XX:+AggressiveOpts

启用一些实验性优化(不推荐生产用)

四、诊断与监控参数

参数

说明

-XX:+HeapDumpOnOutOfMemoryError

OOM 时生成 heap dump

-XX:HeapDumpPath=path

设置 heap dump 文件路径

-XX:+PrintFlagsFinal

打印所有 JVM 参数及其默认值

-XX:+UnlockDiagnosticVMOptions

开启诊断参数

-XX:+UnlockExperimentalVMOptions

开启实验性参数

-XX:+PrintCommandLineFlags

打印显式设置的 JVM 参数

3.说一下 JVM 调优的工具?

1.jps:用于获取 JVM 当前进程

2.jstack:用于获取进程的堆栈状态(jstack [pid])

3.jmap:用于获取进程的堆状态并转存快照(jmap -heap [pid],jmap -dump:format=b,file=heap.hprof

4.jstat:用于获取 GC 状态 (jstat -gc pid,jstat -gcutil pid)

5. jinfo:用于查看正在运行的 JVM 参数(jinfo [pid])

6.jvisualvm:JVM 可视化性能分析器

4.Java 内存泄露的排查思路?

1.通过 JMap 获取堆状态并生成快照;

2.将快照导入 Java Visual VM 中;

3.仔细阅读堆信息的情况,可用大致知道内存溢出是哪行代码出了问题;

4.回到项目,找出对应代码,通过阅读上下文情况,分析代码逻辑,进行修复。

5.CPU 飙高排查方案与思路?

1.首先需要通过 top 指令获知哪些进程占用 CPU 比较高;

2.再通过 top -Hp 指令找出该进程下占用 CPU 比较高的线程;

3.然后用 jstack > jstack.log 获取该进程下所有堆栈信息;

4.在 jstack.log 中查找该线程,并定位造成 高 CPU 使用的代码;

你可能感兴趣的:(jvm,笔记)