深入JVM内核(七)——性能监控工具

由于之前看的容易忘记,因此特记录下来,以便学习总结与更好理解,该系列博文也是第一次记录,所有有好多不完善之处请见谅与留言指出,如果有幸大家看到该博文,希望报以参考目的看浏览,如有错误之处,谢谢大家指出与留言。

序言:

系统性能监控

      确定系统运行的整体状态,基本定位问题所在

Java自带的工具

      查看Java程序运行细节,进一步定位问题

实战分析

      案例问题

一、系统性能监控- linux

(一)、uptime

    系统时间

    运行时间

          例子中为7分钟

   连接数

         每一个终端算一个连接

  1,5,15分钟内的系统平均负载

         运行队列中的平均进程数
(二)、top

同uptime

CPU 内存

每个进程占CPU的情况

可以知道哪个程序占CPU最多

(三)、vmstat

可以统计系统的CPU,内存,swap,io等情况

CPU占用率很高,上下文切换频繁,说明系统有线程正在频繁切换

(四)、pidstat

细致观察进程

需要安装

sudo apt-get install sysstat

监控CPU

监控IO

监控内存

二、系统性能监控 - windows

(一)、Perfmon

Windows自带多功能性能监控工具

(二)、Process Explorer

找到系统内最消耗CPU的线程

(三)、pslist

命令行工具

可用于自动化数据收集

显示java程序的运行情况

三、Java自带的工具

(一)、jps

列出java进程,类似于ps命令

参数-q可以指定jps只输出进程ID ,不输出类的短名称

参数-m可以用于输出传递给Java进程(主函数)的参数

参数-l可以用于输出主函数的完整路径

参数-v可以显示传递给JVM的参数

jps
6260 Jps
7988 Main
400
jps -q
7988
7152
jps -m
7988 Main --log-config-file D:\tools\squirrel-sql-3.2.1\log4j.properties --squir
rel-home D:\tools\squirrel-sql-3.2.1
7456 Jps -m
jps -m
7988 Main --log-config-file D:\tools\squirrel-sql-3.2.1\log4j.properties --squir
rel-home D:\tools\squirrel-sql-3.2.1
7456 Jps -m
jps -m -l -v
6992 sun.tools.jps.Jps -m -l -v -Denv.class.path=.;D:\tools\jdk6.0\lib\dt.jar;D:
\tools\jdk6.0\lib\tools.jar;D:\tools\jdk6.0\lib -Dapplication.home=D:\tools\jdk6
.0 -Xms8m
7988 net.sourceforge.squirrel_sql.client.Main --log-config-file D:\tools\squirre
l-sql-3.2.1\log4j.properties --squirrel-home D:\tools\squirrel-sql-3.2.1 -Xmx256
m -Dsun.java2d.noddraw=true

(二)、jinfo

可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数

-flag <name>:打印指定JVM的参数值

-flag [+|-]<name>:设置指定JVM参数的布尔值

-flag <name>=<value>:设置指定JVM参数的值

显示了新生代对象晋升到老年代对象的最大年龄
jinfo -flag MaxTenuringThreshold 2972
-XX:MaxTenuringThreshold=15
显示是否打印GC详细信息
jinfo -flag PrintGCDetails  2972
-XX:-PrintGCDetails
运行时修改参数,控制是否输出GC日志
jinfo -flag PrintGCDetails  2972
-XX:-PrintGCDetails

jinfo -flag +PrintGCDetails  2972

jinfo -flag PrintGCDetails  2972
-XX:+PrintGCDetails

(三)、jmap    

生成Java应用程序的堆快照和对象的统计信息

jmap -histo 2972 >c:\s.txt

num     #instances         #bytes  class name
----------------------------------------------
   1:          4983        6057848  [I
   2:         20929        2473080  <constMethodKlass>
……………….
1932:             1              8  sun.java2d.pipe.AlphaColorPipe
1933:             1              8  sun.reflect.GeneratedMethodAccessor64
Total        230478       22043360

(四)、Dump堆

jmap -dump:format=b,file=c:\heap.hprof 2972

Dumping heap to C:\heap.hprof ... Heap dump file created

(五)、jstack

打印线程dump

-l 打印锁信息

-m 打印java和native的帧信息

-F 强制dump,当jstack没有响应时使用

(六)、jstack 120 >>C:\a.txt

"main" #1 prio=6 os_prio=0 tid=0x0831c400 nid=0xecc runnable [0x0018f000]
   java.lang.Thread.State: RUNNABLE
	at org.eclipse.swt.internal.win32.OS.WaitMessage(Native Method)
	at org.eclipse.swt.widgets.Display.sleep(Display.java:4657)
	at org.eclipse.ui.application.WorkbenchAdvisor.eventLoopIdle(WorkbenchAdvisor.java:364)
	at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.eventLoopIdle(IDEWorkbenchAdvisor.java:917)
	at org.eclipse.ui.internal.Workbench$3.eventLoopIdle(Workbench.java:487)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1117)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:997)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:140)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:611)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:567)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:354)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:181)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:636)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:591)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1450)

(七)、JConsole

图形化监控工具

可以查看Java应用程序的运行概况,监控堆信息、永久区使用情况、类加载情况等

(八)、Visual VM

Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具

性能监控:找到占用CPU时间最长的方法

分析堆Dump

观察Java线程打印

四、实战分析

1、运行一程序ThreadBlockMain,期望输出Hello,World ,结果在程序运行后,程序卡死,没有预期输出。

2、Java程序HoldCPUMain运行后,发现占用CPU很高,希望能找到原因

(一)、实战分析 - 死锁

死锁

死锁的结果是,程序卡死

可以用jstack查找死锁

如何从jstack的输出中找出死锁

输出最后的总结:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡之路无尽路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值