JVM调优

jvm内存调优

主要为了减少GC频率和Full GC次数
1.Full GC:会对整个堆进行垃圾回收,因为会很耗费时间,所以应该尽量减少Full GC的次数
2、导致Full GC的原因:
1)年老代(Tenured)被写满服务器
调优时尽可能让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要建立过大的 对象及数组避免直接在旧生代建立对象 。
2)持久代Pemanet Generation空间不足jvm
增大Perm Gen空间,避免太多静态对象 , 控制好新生代和旧生代的比例高并发
3)System.gc()被显示调用工具 垃圾回收不要手动触发,尽可能依靠JVM自身的机制

jvm优化步骤

一、分析和定位当前的系统瓶颈

1)CPU指标

查看占用CPU最多的进程

查看占用CPU最多的线程

查看线程堆栈快照信息

分析代码执行热点

查看哪个代码占用CPU执行时间最长

查看每个方法占用CPU时间比例

// 显示系统各个进程的资源使用情况
top
// 查看某个进程中的线程占用情况
top -Hp pid
// 查看当前 Java 进程的线程堆栈信息
jstack pid

2)JVM 内存指标

查看当前 JVM 堆内存参数配置是否合理

查看堆中对象的统计信息

查看堆存储快照,分析内存的占用情况

查看堆各区域的内存增长是否正常

查看是哪个区域导致的GC

查看GC后能否正常回收到内存

// 查看当前的 JVM 参数配置
ps -ef | grep java
// 查看 Java 进程的配置信息,包括系统属性和JVM命令行标志
jinfo pid
// 输出 Java 进程当前的 gc 情况
jstat -gc pid
// 输出 Java 堆详细信息
jmap -heap pid
// 显示堆中对象的统计信息
jmap -histo:live pid
// 生成 Java 堆存储快照dump文件
jmap -F -dump:format=b,file=dumpFile.phrof pid

(3)JVM GC指标

查看每分钟GC时间是否正常

查看每分钟YGC次数是否正常

查看FGC次数是否正常

查看单次FGC时间是否正常

查看单次GC各阶段详细耗时,找到耗时严重的阶段

查看对象的动态晋升年龄是否正常

核心指标
  • jvm.gc.time:每分钟的GC在1s以内,500ms以内为佳
  • jvm.gc.meantime:每次YGC耗时在100ms以内,50ms以内为佳
  • jvm.fullgc.count:FGC最多几小时1次,一天不到一次为佳
  • jvm.fullgc.time:每次FGC耗时在1s以内,500ms为佳

JVM 的 GC指标一般是从 GC 日志里面查看,默认的 GC 日志可能比较少,我们可以添加以下参数,来丰富我们的GC日志输出,方便我们定位问题。

GC日志常用 JVM 参数:

// 打印GC的详细信息
-XX:+PrintGCDetails
// 打印GC的时间戳
-XX:+PrintGCDateStamps
// 在GC前后打印堆信息
-XX:+PrintHeapAtGC
// 打印Survivor区中各个年龄段的对象的分布信息
-XX:+PrintTenuringDistribution
// JVM启动时输出所有参数值,方便查看参数是否被覆盖
-XX:+PrintFlagsFinal
// 打印GC时应用程序的停止时间
-XX:+PrintGCApplicationStoppedTime
// 打印在GC期间处理引用对象的时间(仅在PrintGCDetails时启用)
-XX:+PrintReferenceGC

二、确定优化目标
定位出系统瓶颈后,在优化前先制定好优化的目标是什么,例如:

  • 将FGC次数从每小时1次,降低到1天1次

  • 将每分钟的GC耗时从3s降低到500ms

  • 将每次FGC耗时从5s降低到1s以内

调优方法
1、cpu问题 大多数是和代码有关
2、内存:使用参数合理分配堆大小
3、GC

  • 让大对象进入老年代
  • 设置对象进入老年代的年龄
    -调整新生代或者老年代 避免频繁GC

调优案例:metaspace导致频繁FGC问题

服务环境:ParNew + CMS + JDK8
问题:服务器出现频繁的FullGC
原因分析:
1.查看GC日志发现是mataspace空间不够
2、进一步查看日志发现元空间存在内存碎片化现象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值