Java 性能调优工具

来源:互联网 发布:如果大幅贬值 知乎 编辑:程序博客网 时间:2024/06/05 22:53

CPU使用率

工具: vmstat

  1. 检查应用性能时,应该首先审查CPU时间。
  2. 代码优化的目的是提升而不是降低(更短时间段内的)CPU的使用率。
  3. 在试图深入优化应用前,应该先弄清楚为何CPU使用率低。

磁盘使用率

工具: iostat

  1. 对于所有应用来说,监控磁盘使用率非常重要。即便不直接写磁盘的应用,系统交换仍会影响它们的性能。
  2. 写入磁盘的应用遇到瓶颈,是因为写入数据的效率不高(吞吐率太低),或者是因为写入太多数据(吞吐率太高)。

网络使用率

工具: netstat nicstat

  1. 对于基于网络的应用来说,务必要监控网络以确保它不是瓶颈。
  2. 往网络写数据的应用遇到瓶颈,可能是因为写数据的效率太低(吞吐率太低),或者是因为写入了太多数据(吞吐率太高)。

Java监控工具

  • jcmd: 打印java进程涉及的基本类,线程和VM信息。
  • jconsole: 提供JVM活动的图形化视图,包括线程的使用,类的使用和GC活动。
  • jhat: 读取内存堆转储,并有助于分析。
  • jmap: 提供堆转储和其他JVM内存使用的信息。
  • jinfo: 查看JVM的系统属性,可以动态设置的一些系统属性。
  • jstack: 转储Java进程的栈信息。
  • jstat: 提供GC和类装载活动的信息。
  • jvisualvm: 监视JVM的GUI工具,可以用来剖析运行的应用,分析JVM堆转储。

Can’t attach to the process

jinfo -sysprops ${process_id}Attaching to process ID 18401, please wait...Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the processsun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:163)    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:278)    at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)    at sun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611)    at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337)    at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)    at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)    at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)    at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)    at sun.jvm.hotspot.tools.JInfo.main(JInfo.java:138)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:497)    at sun.tools.jinfo.JInfo.runTool(JInfo.java:108)    at sun.tools.jinfo.JInfo.main(JInfo.java:76)Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access$100(LinuxDebuggerLocal.java:62)    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$1AttachTask.doit(LinuxDebuggerLocal.java:269)    at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)
  • 临时解决方法:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 

该方法在下次重启前有效。

  • 永久有效方法:
sudo vi /etc/sysctl.d/10-ptrace.conf 

将下面这行:
kernel.yama.ptrace_scope = 1
修改为:
kernel.yama.ptrace_scope = 0
重启系统,使修改生效。

参考链接: SA, jinfo, jmap, jstack don’t work on Ubuntu