Java学习笔记21性能调优实战

编程

Java学习笔记21-性能调优实战

我们这次从几个一般常见的问题分析,主要有接口请求过慢或超时,程序突然崩(挂)了,CPU、内存居高不下或忽高忽低,硬盘容量不足等,这些可能是各种情况造成,我们从内存、CPU、线程、网络等(一般都是业务代码有问题)角度分析。

内存相关问题

一、JVM启动参数配置

-Xms4g -Xmx4g: JVM堆内存的最小值、最大值设置为相等

启动时会有预热过程(堆内存小于最小值),逐渐达到最小值

启动时可直接向操作系统申请足够的内存(跳过预热):-XX:+AlwaysPreTouch

二、GC分析与调优

GC分析,主要查看GC导致的stop-the-world,这将导致我们的程序延时增大。

  1. jcmd 查找运行中jar程序的进程号
  2. jmap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况
  3. -Xloggc 收集GC日志(日志离线分析,主要用于检查故障看出是不是因为GC导致的程序卡顿)
  4. 通过GCViewer工具,辅助分析GC日志文件
  5. jstat 动态监控GC统计信息,间隔1000毫秒统计一次,每10行数据后输出列标题

GC调优,切换回收器逐步调试, GC调优的过程就是对每个参数的含义了解后,再根据官方手册,一个个调试,找到符合应用的最佳配置点。是一个细致活,难度高。

  1. Parallel GC 服务器默认,UseAdaptiveSizePolicy自适应默认开启,所以Eden区会自动变化大小
  2. 尝试调大 -XX:ParallelGCThreads=4,如果有多线程,一定要调大参数
  3. 降低耗时,设置 -XX:MaxGCPauseMills=10,单次GC时间加速,会换来更多的GC次数。
  4. 改用CMS回收器 -XX:+UseConcMarkSweepGC,cms高频回收,会抢占用户线程,根据实际需要进行调优
  5. 增加线程 -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=3
  6. 改用G1(建议大堆使用)-XX:+UseG1GC
  7. 增加分区大小 -XX:+UseG1GC -XX:G1HeapRegionSize=64m

规避System.gc()带来的fullgc风险

  • 尽量提前做性能测试
  • 禁用System.gc()显式调用(通常不建议)
  • 小功能调用了System.gc(),也会导致其他功能受牵连,检查第三方包的使用情况

线上环境出现FullGC类的问题处理

  • 问题现象描述:通过监控告警系统,提前收到应用FullGC告警等描述
  • 问题的初步判断:是否版本变更引人?是否异常数据或请求导致
  • 临时解决方案:保留现场+重启/回滚等运维措施
  • 问题排查与分析:FullGC排查工具与分析过程(应用程序的日志分析、JVM的日志分析)
  • 完整解决方案
  • 故障总结

OOM(OutOfMemory)内存溢出

  • OOM 内存快照自动保存 -XX:+HeapDumpOnOutOfMemoryError
  • 内存、CPU不要全部用完。 机器内存6G,那JVM的内存设置2/3,因为JVM自动处理操作,也是需要资源的
  • Eclipse Mat 内存快照的分析工具进行分析
  • Jmap可手动生成内存快照

总结:内存问题通过周全的测试是可以预防的,问题定位也比较直接,工具比较多~~ 一般问题往往是慢慢堆积的~内存占用会慢慢的升高,是可以通过监控工具发现问题,在宕机之前解决。开发时,借鉴线程安全~ 接触到大数据的地方就有泄漏,频繁被执行也有可能出现泄漏。

CPU相关问题

接口请求过慢

  • 现象:请求查询接口过慢,CPU、内存看起没问题
  • 还原:通过 JMeter等测试工具模拟多个用户请求
  • jcmd 查找运行中jar程序的进程号
  • jstack 间隔性查看 jvm 线程情况(间隔时间 == 响应时间)
  • 多次结果的比对,再根据package找出可疑线程(间隔时间后依然存在的线程)

JAVA死锁问题

jstack命令 显示Found one Java-level deadlock

CPU过高

  1. top命令找到CPU占用最大的线程
  2. jstack 保存线程快照
  3. 找到线程ID(十进制 )
  4. 十六进制转化命令: printf "%x

    " 12345

  5. Jstack 拿到的NID == top命令里面pid
  6. 查找分析

排除网络问题

  • ping查看网络延迟
  • netstat 统计网络连接数

线上环境查找问题思路

  • CPU
  • 内存
  • 网络
  • 操作系统日志 tail -f /var/log/messages
  • 日志文件的清理: log4j…file…. (大量公司的线上监控,是不完善的)

程序突然崩(挂)了

jvm进程突然没有了,Linux ( Out Of Memory kill) 干掉jvm进程

以上是 Java学习笔记21性能调优实战 的全部内容, 来源链接: utcz.com/z/512035.html

回到顶部