Java性能调优——常见问题

预备知识

top命令

top命令使我们最常用的Linux命令之一,它可以实时的显示当前正在执行的进程的CPU使用率,内存使用率等系统信息。top -Hp pid 可以查看线程的系统资源使用情况。

jstack命令

jstack是JDK工具命令,它是一种线程堆栈分析工具,最常用的功能就是使用 jstack pid 命令查看线程的堆栈信息,也经常用来排除死锁情况。

mat内存工具

MAT(Memory Analyzer Tool)工具是eclipse的一个插件(MAT也可以单独使用),它分析大内存的dump文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用OQL对象查询,以及可以很方便的找出对象GC Roots的相关信息。

常见问题

CPU占满

  1. top命令查看CPU占用情况,找出线程号
  2. 通过执行top -Hp 32805 查看Java线程情况
  3. 执行 printf '%x' 32826 获取16进制的线程id,用于dump信息查询,结果为 803a。最后我们执行jstack 32805 |grep -A 20 803a来查看下详细的dump信息。
  4. 这里dump信息直接定位出了问题方法以及代码行,这就定位出了CPU占满的问题。

内存泄露

  1. jstat -gc pid 命令来看看程序的GC情况
  2. 借助我们的MAT工具来分析

死锁

死锁会导致耗尽线程资源,占用内存,表现就是内存占用升高,CPU不一定会飙升(看场景决定),如果是直接new线程,会导致JVM内存被耗尽,报无法创建线程的错误,这也是体现了使用线程池的好处。

  1. 通过ps -ef|grep java命令找出 Java 进程 pid
  2. 执行jstack pid 即可出现java线程堆栈信息,找到死锁信息

猜你喜欢

转载自blog.csdn.net/lwl2014100338/article/details/107868274