JVM调优
young GC 和 Full GC 的含义及区别?
- young GC(新生代GC):指发生在新生代的垃圾收集动作,新生代中的对象朝生夕死,所以 Minor GC 非常频繁,回收速度也比较快。
- Full GC(老年代GC):指发生在老年代的GC,速度一般比 Minor GC 慢十倍以上。Full GC 会 Stop-The-World。
什么时候触发young gc?
- 对象优先在新生代 Eden (衣等)区中分配,如果 Eden 区没有足够的空间时,就会触发一次 Young GC 。
什么时候会触发Full GC?
- 调用 System.gc() 方法时,会建议JVM进行Full GC,此方法不建议使用。
- 执行 Young GC之后有一批对象要放入老年代,此时老年代就没有足够的内存空间存放这些对象了,此时必须立即触发一次Old GC
- 发生Young GC之前进行检查,当老年代中最大可用的连续空间小于历代晋升到老年代的对象的平均大小时,会触发Full GC 来让老年代腾出更多的空间。
如何优化GC?
- 尽量不要创建过大的对象或数组。
- 通过虚拟机的 -Xmn 参数适当调大新生代的大小,让对象尽量在新生代中被回收掉。
- 通过 -XX:MaxTenuringThreshold 参数调大对象进入老年代的年龄,让对象尽量在新生代中被回收掉。
JVM性能调优和监控指令
1、jps
jps(java process status tool), 用于查看java进程及相关信息,如果你想找到一个java进程的pid,可以使用jps命令代替linux的ps命令。
命令格式: jps 【options】 【hostid】
options参数:
- -l : 显示进程ID, 显示主类全名或jar路径
- -q :显示进程ID
- -m :显示进程ID, 显示JVM启动时传给main() 函数的参数
- -v : 显示进程ID,显示JVM启动参数
hostid : 主机或其他服务器IP, 不写默认查看本机
2、jinfo
jinfo是用来查看jvm参数和动态修改部分jvm参数的命令
jinfo 【options】 <pid>
options参数解释:
- no options :输出所有的系统属性和参数
- -flag :打印指定名称的参数
- -flag [+|-] : 打开或关闭参数
- -flag = 设置参数值
- -flags 打印所有参数
- -sysprops 打印系统配置
pid代表进程id, 是必传参数
# 查看jvm参数和系统配置 jinfo 1234 jinfo -flags 1234 jinfo -sysprops 1234 # 查看打印GC日志参数 jinfo -flag PrintGC 1234 jinfo -flag PrintGCDetail 1234 # 打开/关闭 GC日志 jinfo -flag +PrintGC 1234 jinfo -flag -PrintGCDetail 1234 # 设置或自改参数值 jinfo -flag -Xms10m 1234
3、jstat
jstat命令主要用于查看jvm运行时状态信息, 包括内存状态、垃圾回收等
命令格式: jstat 【options】 <PID> 【interval】 【count】
interval 是打印间隔时间(ms), count 是打印次数, 默认一直打印
options参数解释:
- -class : classLoader的行为统计
- -complier : hotSpot JIT编译器行为统计
- -gc : 垃圾回收堆的行为统计
- -gccapacity: 各个垃圾回收容量和他们响应空间的统计
- -gcutil: 垃圾回收统计概述
- -gccause:垃圾收集统计概述, 附加最近两次垃圾回收事件的原因
- -gcnew:新生代行为统计
- -gcnewcapacity:新生代与其响应的内存空间的统计
- -gcold:老年代与永久代行为统计
- -gcoldcapacity:老年代行为统计
- -printcompliation: hotSpot编译方法统计
jstat -gcutil 1234 1000 3 # 查看进程1234的垃圾回收信息, 没1s打印一次, 打印三次
4、jstack
jstack是用来查看jvm线程快照的命令, 线程快照是当前jvm线程正在执行的方法堆栈集合。 使用jstack命令可以定位线程出现长时间卡顿的原因, 如死锁、死循环等。 jstack还可以查看程序崩溃时生成的core文件中的stack信息。
命令格式: jstack 【options】 【pid】
options参数解释:
- -F : 当使用jstack无响应时,强制输出线程堆栈
- -m:同时输出java堆栈和c/c++ 堆栈信息
- -l : 除了输出堆栈信息外, 显示关于锁的附加信息
5、jmap
jmap可以生成java程序的dump文件, 也可以查看堆内对象示例的统计信息、查看classLoader的信息以及finalizer队列
命令格式: jmap 【options】 <pid>
options参数解释 :
- no options 如果使用不带选项参数的jmap打印共享对象映射, 将会打印目标虚拟机中加载的每个对象的起始地址、映射大小及共享对象文件的路径全称。(很占资源, 一般不会使用)
- -heap: 打印java heap 摘要
- -histo[:live] : 打印堆中的java对象统计信息
- -clstats : 打印类加载器统计信息
- -finalizerinfo:打印在f-queue中等待执行finalizer方法的对象
- -dump: 生成java堆的dump文件, dump-options:
- live : 只转储存活的对象,如果没有指定则转储所有对象
- format=b: 二进制格式
- file=[Path] : 将文件转储到指定文件中
使用示例:
jmap -dump:live,format=b,file=/dump.bin 1234 #将java堆中存活的对象信息转储到/dump.bin文件中
看一下堆信息:
jmap -heap 1234
输出:
Attaching to process ID 11666, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.25-b02 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: //堆内存初始化配置 MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40) MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70) MaxHeapSize= 1073741824 (1024.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小 NewSize = 22020096 (21.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的新生代的默认大小 MaxNewSize = 357564416 (341.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的新生代的最大大小 OldSize = 45088768 (43.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的老年代的大小 NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:新生代和老生代的大小比率 SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置新生代中Eden区与Survivor区的大小比值 MetaspaceSize = 21807104 (20.796875MB) // 元数据区大小 CompressedClassSpaceSize = 1073741824 (1024.0MB) //类压缩空间大小 MaxMetaspaceSize = 17592186044415 MB //元数据区最大大小 G1HeapRegionSize = 0 (0.0MB) //G1垃圾收集器每个Region大小 Heap Usage: //堆内存使用情况 PS Young Generation Eden Space: //Eden区内存分布 capacity = 17825792 (17.0MB) //Eden区总容量 used = 12704088 (12.115562438964844MB) //Eden区已使用 free = 5121704 (4.884437561035156MB) //Eden区剩余容量 71.26801434685203% used //Eden区使用比率 From Space: //其中一个Survivor区的内存分布 capacity = 2097152 (2.0MB) used = 1703936 (1.625MB) free = 393216 (0.375MB) 81.25% used To Space: //另一个Survivor区的内存分布 capacity = 2097152 (2.0MB) used = 0 (0.0MB) free = 2097152 (2.0MB) 0.0% used PS Old Generation capacity = 52428800 (50.0MB) //老年代容量 used = 28325712 (27.013504028320312MB) //老年代已使用 free = 24103088 (22.986495971679688MB) //老年代空闲 54.027008056640625% used //老年代使用比率 15884 interned Strings occupying 2075304 bytes.
输出存活对象信息 :
jmap -histo:live 1234 | more
6、jhat
jhat 用来分析jmap生成dump文件的命令, jhat内置了应用服务器,可以通过网页查看dump文件分析结果,jhat一般用于离线分析
命令格式: jhap 【options】 【dumpfile】
option参数解释:
- -stack false : 关闭对象分配调用堆栈的跟踪
- -refs false: 关闭对象引用的跟踪
- -port: HTTP服务器端口, 默认是7000
- -debug: debug级别
- -version: 分析报告版本
JVM参数设置
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术