1.5 jhat命令

使用 jhat 工具可以用于分析Java应用程序的堆快照内容。以前文中jmap的输出对文件 heap.hprof 为例:

jstat-gc命令详解_jstat_jstat分析内存溢出

jhat 在分析完成后,使用HTTP服务器展示其分析结果。在浏览器中访问:7000/,结果如图所示。

jstat分析内存溢出_jstat_jstat-gc命令详解

在默认页中,jhat 服务器显示了所有的非平台类信息。单击链接进入,可以查看选中类的超类、 以及该类的实例等信息。此外,在页面底部,jhat还为开发人员提供了其他查询方式(Other )。

通过这些链接,开发者可以进一步查看所有类信息(包括Java平台的类)。所有类的实例数量以及实例的具体信息。最后,还有一个链接指向OQL查询界面。

图中显示了在jhat中,查看Java应用程序里java.lang.类的实例数量:

jstat-gc命令详解_jstat_jstat分析内存溢出

单击 链接可以进一步查看 对象的实例,如图所示:

jstat分析内存溢出_jstat-gc命令详解_jstat

通常,导出的堆快照信息可以非常大,由于信息太多,可能很难通过页面上简单的链接索引找到想要的信息。为此,jhat还支持使用OQL语句对堆快照进行查询。执行 OQL 语言的界面非常简洁,如图所示。使用OQL查询出当前Java程序中所有java.io.File对象的路径。OQL如下:

select file.path.value.toString() from java.io.File file

jstat_jstat-gc命令详解_jstat分析内存溢出

1.6 命令

可用于导出Java应用程序的线程堆栈。语法为:

jstack [-l] 

-l选项用于打印锁的附加信息。

工具会在控制台输出程序中所有的锁信息,可以使用重定向将输出保存到文件,如:

jstack -l 16196 >edeadlock.txt

通过 工具不仅可以得到线程堆栈,它还能自动进行死锁检查,输出找到的死锁信息。

1.7 命令

之前所述的工具中,只涉及到监控本机的Java应用程序。而在这些工具中,一些监控工具也支持对远程计算机的监控(如:jps、jstat)。为了启用远程监控,则需要配合使用工具。

命令是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。服务器将本机的Java应用程序信息传递到远程计算机。

jstat_jstat-gc命令详解_jstat分析内存溢出

直接打开服务器可能会抛出访问拒绝异常:

jstat_jstat分析内存溢出_jstat-gc命令详解

这是由于程序没有足够的权限所致,可以使用Java的安全策略,为其分配相应的权限,下面代码为分配了最大的权限,将其保存在.all.文件中:

grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};

然后,使用以下命令再次开启服务器:

 jstatd -J-Djava.security.policy=c:jstatd.all.policy

服务器即可开启成功。

-J参数是一个公共的参数,如jps、jstat等命令都可以接受这个参数。由于jsp、jstat命令本身也是Java应用程序,-J参数可以为jps等命令本身设置其JVM参数。

默认情况下, 将在1099端口开启RMI服务器:

jstat分析内存溢出_jstat-gc命令详解_jstat

使用jps命令显示远程计算机的Java进程:

jps localhost:1099

使用jstat命令显示远程进程460的GC情况:

jstat -gcutil 460@localhost:1099

1.8 hprof工具

hprof不是独立的监控工具,它只是一个Java agent工具,它可以用于监控Java应用程序在运行时的CPU信息和堆信息。使用 java -:hprof=help 命令可以查看hprof 的帮助文档。下面是 hropf 工具帮助信息的输出:

jstat分析内存溢出_jstat-gc命令详解_jstat

使用hprof工具可以查看程序中各个函数的CPU占用时间。以下代码包含3个方法,分别占用不同的CPU时间:

public class HProfTest {
 public void slowMethod(){
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 public void slowerMethod(){
 try {
 Thread.sleep(10000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 public void fastMethod(){
 try {
 Thread.yield();
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 public static void main(String[] args) {
 HProfTest hProfTest = new HProfTest();
 hProfTest.fastMethod();
 hProfTest.slowMethod();
 hProfTest.slowerMethod();
 }
}

使用参数-:hprof=cpu=times,=10运行以上代码。times选项将会在Java函数的调用前后记录函数的执行时间,进而计算函数的执行时间。hprof=cpu是针对cpu统计时间。=10 采样10次。程序运行后会发现多了一个文本文件java.hprof.txt,打开后查看部分输出如下,可以很容易看到运行时间最长的函数:

jstat_jstat分析内存溢出_jstat-gc命令详解

使用参数-:hprof=heap=dump,=b,file=e:core.hprof 运行程序,可以将应用程序的堆快照保存在指定文件 e:core.hprof 中。使用MAT或者 VM等工具可以拆这个堆文件。

使用参数 -:hprof=heap=sites 运行程序,可以输出Java应用程序中各个类所占的内存百分比,部分输出如下:

jstat分析内存溢出_jstat_jstat-gc命令详解

2.工具

(Java and )工具时JDK自带的图形化性能监控工具。通过工具,可以查看Java应用程序的运行概况,监控堆信息、永久区使用情况、类加载情况等。本节主要介绍工具的基本使用方法。

2.1 连接Java程序

程序在%%/bin目录下,双击启动后,程序便要求指定连接Java应用程序,如图所示。

jstat分析内存溢出_jstat_jstat-gc命令详解

在罗列的本地Java应用程序选择PID为15908的程序,连接。

如果需要使用连接远程进程,则需要在远程Java应用程序启动时,加上如下参数:

-Djava.rmi.server.hostname=127.0.0.1 #远程服务器的ip地址
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8888 #指定jmx监听的端口
-Dcom.sun.management.jmxremote.authenticate=false #是否开启认证
-Dcom.sun.management.jmxremote.ssl=false #是否开启ssl

基于以上配置启动的Java应用程序,通过在远程连接时,只需要填写如下远程进程即可:

127.0.0.1:8888

2.2 Java程序概况

在连接上Java应用程序后,便可以查看应用程序概况。

jstat_jstat-gc命令详解_jstat分析内存溢出

2.3 内存监控

切换到内存监控页面, 可以显示当前内存的详细信息。这不仅是包括堆内存的整体信息,更细化到eden区、 区、老年代的使用情况。同时,也包括非堆区,即永久代的使用情况,如图所示,单机界面右上角的“执行GC”按钮,可以强制应用程序进行一次Full GC。

jstat_jstat-gc命令详解_jstat分析内存溢出

2.4 线程监控

中的线程选项卡允许开发人员监控程序内的线程,如图所示。 显示了系统内的线程数量,并在屏幕下方,显示了程序中所有的线程。单击线程名称,便可以查看线程的栈信息。

jstat_jstat-gc命令详解_jstat分析内存溢出

使用最下方的“监测死锁”按钮。还可以自动监测多线程应用程序的死锁情况。

2.5 类加载情况

的类页面如图所示,显示了系统以及装载的类数量。在详细信息栏中,还显示了已卸载的类数量。

jstat-gc命令详解_jstat_jstat分析内存溢出

2.6 虚拟机信息

在VM摘要页面, 显示了当前应用程序的运行环境。包括虚拟机类型、版本、堆信息以及虚拟机参数等。

jstat-gc命令详解_jstat_jstat分析内存溢出

2.7 MBean管理

MBean页面允许通过进行MBean的管理,包括查看或者设置MBean的属性、运行MBean的方法等。下图是MBean的管理界面,这里选中了的属性。通过修改的属性值,可以在程序运行时动态打开或者关闭GC的输出信息。

jstat-gc命令详解_jstat分析内存溢出_jstat

MBean种类繁多。主要的操作如下:

jstat_jstat-gc命令详解_jstat分析内存溢出

2.8 使用插件

除了基本功能之外,还支持插件扩展。在JDK的安装目录下,就有一个自带的插件。使用以下命令可以让加载插件并启动:

jconsole -pluginpath C:Javajdk1.6.0_22demomanagementJTopJTop.jar

启动后,连接到任意Java应用程序,便可以进入JTop页面。

作者:像风一样
原文:https://www.cnblogs.com/yueshutong/p/9812464.html

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666

声明:1、本内容转载于网络,版权归原作者所有!2、本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。3、本内容若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!