【齐全】Java自带的性能监测工具用法简介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm

合集下载

jstack的使用

jstack的使用

jstack的使用
jstack是Java虚拟机自带的一种命令行工具,用于生成当前正在运行的Java程序的线程快照,可以通过分析线程状态、调用堆栈等信息来定位程序中的瓶颈和问题。

使用jstack的步骤如下:
1. 打开命令行窗口,进入Java程序运行的目录;
2. 输入命令“jps”查看当前Java程序的进程ID;
3. 输入命令“jstack 进程ID”生成线程快照;
4. 分析线程快照中的线程状态、调用堆栈等信息,定位程序中的问题。

在使用jstack时,需要了解的一些常用参数:
-f:输出Java虚拟机进程中所有线程的调用堆栈信息,包括锁信息和等待队列信息;
-l:输出线程的锁信息,包括持有的锁和等待的锁;
-m:输出Java虚拟机进程中所有线程的调用堆栈信息和本地方法调用信息;
-n:输出Java虚拟机进程中所有线程的调用堆栈信息,但不包括锁信息和等待队列信息;
-s:输出线程的状态信息。

除了jstack外,还有其他一些类似的工具,如jvisualvm、jconsole等,也可以用于监控和分析Java程序的运行状态。

但是jstack作为Java虚拟机自带的工具,使用简单、方便,是解决
Java程序问题的常用手段之一。

jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

周末看到一个用jstack查看死锁的例子。

昨天晚上总结了一下jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令。

供大家参考1.Jstack1.1 jstack能得到运行java程序的java stack和native stack的信息。

可以轻松得知当前线程的运行情况。

如下图所示注:这个和thread dump是同样的结果。

但是thread dump是用kill -3 pid命令,还是服务器上面少用kill为妙1.2 命名行格式jstack [ option ] pidjstack [ option ] executable corejstack [ option ] [server-id@]remote-hostname-or-IP最常用的还是jstack pid1.3 在thread dump中,要留意下面几种状态死锁,Deadlock(重点关注)等待资源,Waiting on condition(重点关注)•等待获取监视器,Waiting on monitor entry(重点关注)阻塞,Blocked(重点关注)•执行中,Runnable•暂停,Suspended•对象等待中,Object.wait() 或TIMED_WAITING•停止,Parked下面有详细的例子讲这种分析,大家参考原著/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html1.4 在thread dump中,有几种线程的定义如下线程名称所属解释说明Attach Listener JVM Attach Listener 线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者。

通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version、jmap、jstack等等。

如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动。

了解Java的性能监控与调优工具

了解Java的性能监控与调优工具

了解Java的性能监控与调优工具Java作为一种广泛应用于软件开发的编程语言,性能优化是提高应用程序执行效率和稳定性的关键。

针对Java应用的性能问题,我们可以通过使用性能监控与调优工具来进行分析和优化。

本文将介绍一些常用的Java性能监控和调优工具,帮助读者更好地了解和应用这些工具。

一、JVM监控工具1. Java虚拟机工具接口(JVM TI)JVM TI是Java虚拟机提供的一组用于监控和调试的原生编程接口。

它允许开发人员在应用程序运行过程中获取关于线程、堆栈、类、对象等方面的信息,并进行性能分析和问题排查。

通过使用JVM TI,开发人员可以深入分析应用程序在虚拟机上的执行情况。

2. Java监视与管理控制台(JConsole)JConsole是Java Development Kit(JDK)中提供的一种监视和管理Java虚拟机的工具。

它可以实时监控虚拟机的性能指标,如内存使用情况、线程数量、垃圾回收等,并提供图形化界面展示这些指标的变化趋势。

通过JConsole,开发人员可以实时观察应用程序在运行过程中的性能表现,及时发现和解决问题。

3. Java视觉化虚拟机监控工具(VisualVM)VisualVM是一个功能强大的Java虚拟机监控和调优工具,可以监视本地和远程虚拟机的运行情况。

它提供了丰富的性能分析功能,如CPU和内存使用情况、线程分析、垃圾回收等。

同时,VisualVM还支持插件扩展,可以与其他性能分析工具集成使用,进一步增强其功能和灵活性。

二、应用性能分析工具1. Apache JMeterApache JMeter是一种用于性能测试的工具,可以模拟多个用户并发访问应用程序,评估其性能和稳定性。

它支持多种协议和服务器类型,如HTTP、FTP、Web Services、数据库等。

通过使用JMeter进行性能测试,可以发现应用程序在高负载情况下的性能瓶颈,并进行相应的优化。

2. AppDynamicsAppDynamics是一种全栈应用性能监控工具,可以实时监控和分析应用程序的性能和可用性。

jstack工具的描述

jstack工具的描述

jstack工具的描述jstack工具是一种用于Java应用程序的调试和性能分析工具。

它可以生成线程转储信息,以帮助开发人员分析应用程序的状态和性能问题。

本文将介绍jstack工具的使用方法以及如何解读线程转储信息。

一、jstack工具的基本概念jstack工具是Java Development Kit(JDK)中自带的一个命令行工具,用于生成Java应用程序的线程转储信息。

线程转储信息是指当前Java进程中所有线程的堆栈跟踪信息,包括每个线程的调用栈和锁信息。

二、使用jstack工具生成线程转储信息要使用jstack工具生成线程转储信息,首先需要找到正在运行的Java进程的进程ID。

可以使用命令"ps -ef | grep java"来查找Java进程,并找到目标进程的进程ID。

然后,在命令行中输入"jstack <进程ID>",即可生成线程转储信息。

三、解读线程转储信息生成线程转储信息后,我们可以通过分析其中的内容来了解Java应用程序的状态和性能问题。

下面是线程转储信息中常见的几个部分:1. 转储信息的头部转储信息的头部包含了进程ID、进程名称、生成转储信息的时间等基本信息。

这些信息可以帮助我们定位转储信息的来源和生成的时间点。

2. 线程状态线程状态可以告诉我们当前线程的状态,如RUNNABLE(正在执行)、WAITING(等待)、TIMED_WAITING(计时等待)等。

通过查看线程状态,我们可以判断是否存在线程阻塞或等待的情况。

3. 线程调用栈线程调用栈是线程的执行路径,它展示了线程目前所调用的方法以及每个方法的调用关系。

通过分析线程调用栈,我们可以了解到线程当前执行的代码位置,从而判断是否存在死循环、长时间运行的方法等问题。

4. 线程锁信息线程锁信息可以告诉我们线程当前持有的锁和等待的锁。

通过查看线程锁信息,我们可以判断是否存在死锁或锁竞争的情况。

jconsole工具使用

jconsole工具使用

jconsole⼯具使⽤Jconsole,Java Monitoring and Management Console。

是JDK⾃带的⼯具,在JDK/bin⽬录下可以找到。

它⽤于连接正在运⾏的本地或者远程的,对运⾏在应⽤程序的资源消耗和性能进⾏监控,并画出⼤量的图表,提供强⼤的可视化界⾯。

⽽且本⾝占⽤的服务器内存很⼩,甚⾄可以说⼏乎不消耗。

⼀、介绍JConsole 是⼀个内置 Java 性能分析器,可以从命令⾏(直接输⼊jconsole)或在 GUI shell (jdk\bin下打开)中运⾏。

它⽤于对JVM中内存,线程和类等的监控。

可使⽤JTop插件。

它可以监控本地的jvm,也可以监控远程的jvm,也可以同时监控⼏个jvm。

这款⼯具的好处在于,占⽤系统资源少,⽽且结合Jstat,可以有效监控到java内存的变动情况,以及引起变动的原因。

在项⽬追踪内存泄露问题时,很实⽤。

使⽤ JConsole 进⾏⼯作分析器有⾃⼰的开销,因此最好的办法就是花点时间来弄清是什么开销。

发现 JConsole 开销最简单的办法是,⾸先独⾃运⾏⼀个应⽤程序,然后在分析器下运⾏,并测量差异。

(应⽤程序不能太⼤或者太⼩;我最喜欢使⽤ JDK 附带的 SwingSet2 样本。

)因此,我使⽤-verbose:gc尝试运⾏ SwingSet2 来查看垃圾收集清理,然后运⾏同⼀个应⽤程序并将 JConsole 分析器连接到它。

当 JConsole 连接好了之后,⼀个稳定的 GC 清理流出现,否则不会出现。

这就是分析器的性能开销。

远程监控⼆、远程监控⼆、因为 Web 应⽤程序分析⼯具假设通过⼀个套接字进⾏连通性分析,只需要进⾏少许配置来设置 JConsole(或者是基于 JVMTI 的分析器,就这点⽽⾔),监控/分析远程运⾏的应⽤程序。

远程监控与本地监控配置类似,这⾥以监控远程为例。

1、监控tomcat服务器端:详细步骤如下所⽰:1、修改Tomcat的bin⽬录下的catalina.bat⽂件vi catalina.sh找到# OS specific support. $var _must_ be set to either true or false.添加如下变量:JAVA_OPTS="${JAVA_OPTS} -Djava.rmi.server.hostname=192.168.56.253-Dcom.sun.management.jmxremote.port=9999-Dcom.sun.management.jmxremote.authenticate=true-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.acccess.file=/usr/local/tomcat/bin/jconsole/jmxremote.access-Dcom.sun.management.jmxremote.password.file=/usr/local/tomcat/bin/jconsole/jmxremote.password"注意:这⾥是⼀⾏,空格不合适可能会启动不了服务。

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解J DK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。

现实企业级Java开发中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露线程死锁锁争用(Lock Contention)Java 进程消耗CPU过高......这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。

本文将对一些常用的JVM 性能调优监控工具进行介绍,希望能起抛砖引玉之用。

A、jps(Java Virtual Machine Process Status Tool) jps 主要用来输出JVM中运行的进程状态信息。

语法格式如下:jps[options] [hostid]如果不指定hostid就默认为当前主机或服务器。

命令行参数选项说明如下:-q 不输出类名、Jar名和传入main方法的参数-m 输出传入main 方法的参数-l 输出main类或Jar的全限名-v 输出传入JVM的参数比如下面:root@ubuntu:/# jps -m -l2458org.artifactory.standalone.main.Main /usr/local/artifactory-2.2.5/etc/jetty.xml29920 com.sun.tools.hat. Main -port 9998 /tmp/dump.dat3149 org.apache.catalina.startup.Boo tstrap start30972 sun.tools.jps.Jps -m -l8247 org.apache.catalin a.startup.Bootstrap start25687com.sun.tools.hat.Main -port 9999 dump.dat21711 mrf-center.jarB、jstack jstack主要用来查看某个Java进程内的线程堆栈信息。

Java问题定位工具——jstack

Java问题定位⼯具——jstack简介jstack 主要⽤于⽣成虚拟机当前时刻的「线程快照」。

线程快照是当前 Java 虚拟机每⼀条线程正在执⾏的⽅法堆栈的集合。

⽣成线程快照的主要⽬的是⽤于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间等待。

基础线程的⼏种状态NEW,未启动的。

不会出现在Dump中。

RUNNABLE,在虚拟机内执⾏的。

BLOCKED,受阻塞并等待监视器锁。

WATING,⽆限期等待另⼀个线程执⾏特定操作。

TIMED_WATING,有时限的等待另⼀个线程的特定操作。

TERMINATED,已退出的。

调⽤修饰表⽰线程在⽅法调⽤时,额外的重要的操作。

线程 Dump 分析的重要信息。

修饰上⽅的⽅法调⽤。

locked <地址> ⽬标:使⽤ synchronized 申请对象锁成功,监视器的拥有者。

waiting to lock <地址> ⽬标:使⽤ synchronized 申请对象锁未成功,在迚⼊区等待。

waiting on <地址> ⽬标:使⽤ synchronized 申请对象锁成功后,释放锁幵在等待区等待。

parking to wait for <地址> ⽬标死锁所谓死锁:是指两个或两个以上的进程在执⾏过程中,由于竞争资源或者由于彼此通信⽽造成的⼀种阻塞的现象,若⽆外⼒作⽤,它们都将⽆法推进下去。

此时称系统处于死锁状态或系统产⽣了死锁,这些永远在互相等待的进程称为死锁进程。

说⽩了,我现在想吃鸡蛋灌饼,桌⼦上放着鸡蛋和饼,但是我和我的朋友同时分别拿起了鸡蛋和病,我⼿⾥拿着鸡蛋,但是我需要他⼿⾥的饼。

他⼿⾥拿着饼,但是他想要我⼿⾥的鸡蛋。

就这样,如果不能同时拿到鸡蛋和饼,那我们就不能继续做后⾯的⼯作(做鸡蛋灌饼)。

所以,这就造成了死锁线程 Dump 分析结合代码阅读的推理。

需要线程 Dump 和源码的相互推导和印证。

【IT专家】jstack命令(Java Stack Trace)

本文由我司收集整编,推荐下载,如有疑问,请与我司联系jstack命令(Java Stack Trace)2017/09/29 67 JDK内置工具使用 一、javah命令(CHeaderandStubFileGenerator) 二、jps命令(JavaVirtualMachineProcessStatusTool) 三、jstack命令(JavaStackTrace) 四、jstat命令(JavaVirtualMachineStatisticsMonitoringTool) 五、jmap命令(JavaMemoryMap) 六、jinfo命令(JavaConfigurationInfo) 七、jconsole命令(JavaMonitoringandManagementConsole) 八、jvisualvm命令(JavaVirtualMachineMonitoring,Troubleshooting,andProfilingTool) 九、jhat命令(JavaHeapAnalyseTool) 十、Jdb命令(TheJavaDebugger) 十一、Jstatd命令(Java Statistics Monitoring Daemon) 1、介绍jstack用于打印出给定的java进程ID或corefile或远程调试服务的Java 堆栈信息,如果是在64位机器上,需要指定选项”-J-d64”,Windows的jstack使用方式只支持以下的这种方式: jstack[-l]pid 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的javastack和nativestack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。

另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的javastack和nativestack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

内存监控JConsole使用

内存监控JConsole使用一、JConsole远程监控Tomcat服务器为了解决内存溢出的问题,会用到一些监视内存的工具,jconsole这个工具是jdk5.0自带的工具,所以如果你的jdk是5.0那么就不用去安装。

这个工具可以查看系统的堆,非堆,线程,等等的一些整体的情况,从而可以判断出系统的一个大概的性能情况。

那么配置如下:如果你是用tomcat,在catalina.bat来设置set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=7080 -Dcom.sun.management.jmxremote特别注意:-Dcom.sun.management.jmxremote.port=7080,这个端点是jconsole专用的,不要和你的系统的端点冲突。

再启动你的应用。

ok,配置好了后,就直接进dos命令,后输入java 回车,再接着输入jconsole,它会弹出一个界面,你直接点“远程连接”的选项卡,主机就填你要监控的ip地址名,端口与你配的-Dcom.sun.management.jmxremote.port 的端口一致就可以了,再连接就可以了。

如果连接成功就会进入监控你的系统。

二、JConsole远程监控JBoss服务器Java 5.0采用JMX方式提供了一系列监视和管理虚拟机的API,随SDK一起发布的JConsole 则是采用这些API实现监控虚拟机的使用工具。

JConsole能够提供被监控虚拟机的内存、线程、类的加载以及MBean等信息,从而能够对服务器的运行情况进行实时监控。

1、环境服务器:Redhat Linux ES 3.0 + JDK 1.5.06 + Jboss 4.0.2ip地址:192.168.1.5客户机:Windows + JDK 1.5.062、配置修改java虚拟机启动参数在%JBOSS_HOME%\bin\run.sh文件中将JAVA_OPTS="$JAVA_OPTS =$PROGNAME "修改为:JAVA_OPTS="$JAVA_OPTS =$PROGNAME -Dcom.sun.management.jmxremote.port=9999-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false"注意:9999表示监控的端口号,确保指定的端口不被占用;可以采用netstat -an来查看已经占用的端口;配合lsof -i:portnum 来查看占用端口的具体应用程序;另外如果开启了防火墙服务,请确保端口能够透过防火墙访问;启动JBoss服务器./run.sh -b192.168.1.5,必须通过-b参数指定Jboss服务器绑定的地址;连接远程虚拟机启动%JAVA_HOME%\bin目录下的JConsole,在弹出对话框的“远程”属性页的“主机名或ip”中输入192.168.1.5,在“端口”中输入9999,选择“连接”,就能查看到远程Jboss服务器的运行情况了。

使用jconsole工具来监控java运行情况

使⽤jconsole⼯具来监控java运⾏情况参考:经验证OKjconsole是jdk⾃带的⼯具。

所以要先安装jdk1.jconsole⼯具的路径:通过which jconsole来查看/usr/local/jdk1.7.0_79/bin/jconsole2.使⽤⽅式:在linux监控端的图形界⾯执⾏:/usr/local/jdk1.7.0_79/bin/jconsole将出现图形化java监控和管理控制台。

3.执⾏后出现JConsole新建连接,有两个选择:1.本地进程(可以监控本机的java)——》org.apache.catalina.startup.Bootstartup start2.远程进程(⽤于监控其他主机的java)——》填写需要被监控的主机名:监控端⼝,输⼊监控专⽤的⽤户名/密码(可选)步骤1:需在被监控的主机上修改catalina.sh配置⽂件:vi /opt/tomcat/conf/catalina.sh如不需密码验证,则在第⼆⾏开始添加下⾯3⾏:JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"保存退出//“12345”为监控端⼝号如需密码验证,则改为下⾯4⾏:JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=true"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.pwd.file=/usr/local/jdk1.7.0_79/jre/lib/management/jmxremote.password"保存退出步骤2:将/usr/local/jdk1.7.0_79/jre/lib/management/jmxremote.password.template复制⼀份:cp /usr/local/jdk1.7.0_79/jre/lib/management/jmxremote.password.template \/usr/local/jdk1.7.0_79/jre/lib/management/jmxremote.password步骤3:添加⽤于远程监控的⽤户名和密码:vi jmxremote.password //⽤于添加⽤户名和密码monitorRole 12345678 //⽤户名:monitorRole,这个名字系统是预先设置好的admin 123456 //⾃定义了⽤户名:adminroot 123456 //⾃定义了⽤户名:root强制保存退出vi jmxremote.access //⾃定义监控的⽤户名具有哪些权限添加:admin readonly //定义只读帐号,名字任意root readwrite \//定义读写帐号,名字任意create javax.management.monitor.*,javax.management.timer.* \保存退出chmod 600 jmxremote.passwordchown uucp:uucp jmxremote.password //先⽤ls -l /usr/local/jdk1.7.0_79看看是属于哪个⽤户和组,再设置成相同的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java自带的性能监测工具用法简介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm在开始介绍之前,先介绍几篇写的比较详细的博客,咱们不求最精,一定最全,最省事。

/fenglibing/article/details/6411924一、jstatd启动jvm监控服务。

它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。

默认端口1099。

实例:jstatd -J-Djava.security.policy=my.policymy.policy文件需要自己建立,内如如下:Java代码1.grant codebase "file:${java.home}/../lib/tools.jar" {2. permission java.security.AllPermission;3.};这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作二、jps列出所有的jvm实例实例:jps列出本机所有的jvm实例jps 192.168.0.77列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099(前提是远程服务器提供jstatd服务)输出内容如下:jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps6286 Jps6174 Jstat详细请看连接:/aoxj/archive/2007/12/29/171447.html三、jconsole图形工具,必须在图形界面上执行用法: jconsole [ -interval=n ] [ -notile ] [ -pluginpath ] [ -version ] [ connection ...]-interval 将更新间隔时间设置为 n 秒(默认值为 4 秒)-notile 最初不平铺显示窗口(对于两个或更多连接)-pluginpath 指定 jconsole 用于查找插件的路径-version 输出程序版本connection = pid || host:port || JMX URL (service:jmx:://...)pid 目标进程的进程 IDhost 远程主机名或 IP 地址port 用于远程连接的端口号-J 对正在运行 jconsole 的 Java 虚拟机指定输入参数在cmd中输入命令:jconsole 3980[java进程号] 弹出下图四、jinfo用法:jinfo [ option ] pidjinfo [ option ] executable corejinfo [ option ] [server-id@]remote-hostname-or-IP参数:pid 进程号executable 产生core dump的java executablecore core fileremote-hostname-or-IP 主机名或ipserver-id 远程主机上的debug server的唯一id选项:no option 打印命令行参数和系统属性-flags 打印命令行参数-sysprops 打印系统属性-h 帮助观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数实例:jinfo 2083其中2083就是java进程id号,可以用jps得到这个id号。

我在windows上尝试输入这个命令,但是不管用,于是我输入了下面这个命令:jinfo -flag MaxPermSize 3980显示如下:-XX:MaxPermSize=67108864五、jstack该命令应该如何使用呢?首先需要用jstack命令产生java进程的dump文件,然后分析dump文件中的数据,下面的连接是一篇讲述如何分析jstack产生的dump文件数据的文章,写的非常不错:/jzone/articles/303979.html命令格式:jstack [ option ] pid基本参数:-F当’jstack [-l] pid’没有相应的时候强制打印栈信息-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.-m打印java和native c/c++框架的所有栈信息.-h | -help打印帮助信息pid 需要被打印配置信息的java进程id,可以用jps查询.具体用法jstack -l 进程ID六、jmap(linux下特有,也是很常用的一个命令)观察运行中的jvm物理内存的占用情况。

Usage:jmap [option] <pid>(to connect to running process)jmap [option] <executable <core>(to connect to a core file)jmap [option] [server_id@]<remote server IP or hostname>(to connect to remote debug server)where <option> is one of:<none> to print same info as Solaris pmap-heap to print java heap summary-histo[:live] to print histogram of java object heap; if the "live"suboption is specified, only count live objects-permstat to print permanent generation statistics-finalizerinfo to print information on objects awaiting finalization-dump:<dump-options> to dump java heap in hprof binary formatdump-options:live dump only live objects; if not specified,all objects in the heap are dumped.format=b binary formatfile=<file> dump heap to <file>Example: jmap -dump:live,format=b,file=heap.bin <pid>-F force. Use with -dump:<dump-options> <pid> or -histoto force a heap dump or histogram when <pid> does notrespond. The "live" suboption is not supportedin this mode.-h | -help to print this help message-J<flag> to pass <flag> directly to the runtime system参数如下:-heap:打印jvm heap的情况-histo:打印jvm heap的直方图。

其输出信息包括类名,对象数量,对象占用大小。

-histo:live :同上,但是只答应存活对象的情况-permstat:打印permanent generation heap情况命令使用:jmap -heap 2083可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况jmap -histo 2083 | jmap -histo:live 2083可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。

包括对象数量和所占空间大小。

jmap -histo java进程id可以查看java进程中的所有实例、实例的个数,可用于查询单例对象是否真的只生成了一个实例。

在控制台,输入命令“jmap -histo 7329 > histo_dump”,得到如下结果:Java代码1.num #instances #bytes class name2.---------------------------------------------3.1: 60534868849960 [C4.2: 160973451511488 java.util.concurrent.ConcurrentHashMap$Segment5.3: 161002238640528 java.util.concurrent.locks.ReentrantLock$NonfairSync6.4: 7078431478168 [I7.5: 21822427628072 <constMethodKlass>8.6: 160973426423552 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;9.7: 4037924430792 [B10.8: 21822419211544 <methodKlass>11.9: 60284814468352 ng.String12.10: 1937411640184 <constantPoolKlass>13.11: 23695011451216 <symbolKlass>14.12: 28374611349840 java.util.concurrent.ConcurrentHashMap$ValueIterator15.13: 193748826272 <instanceKlassKlass>16.14: 1006138048728 [Ljava.util.concurrent.ConcurrentHashMap$Segment;17.15: 850367332664 [ng.Object;18.16: 155596614824 <constantPoolCacheKlass>19.17: 789196313520 ng.reflect.Method20.18: 1033774962096 com.sun.tools.javac.zip.ZipFileIndexEntry21.19: 519984324096 [Ljava.util.HashMap$Entry;22.20: 1006134024520 java.util.concurrent.ConcurrentHashMap23.21: 1571363771264 java.util.concurrent.ConcurrentHashMap$HashEntry24.22: 359323736928 info.dbm.core.bean.monitor.FlowService25.23: 359323736928 info.dbm.core.bean.monitor.FlowService该命令通常用来分析内存泄漏OOM,通常做法是,首先配置JVM启动参数,让JVM在遇到OutOfMemoryError时自动生成Dump文件:Java代码1.-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path然后使用命令:Java代码1.jmap -dump:format=b,file=/path/heap.bin 进程ID如果只dump heap中的存活对象,则加上选项-live,如下:Java代码1.jmap -dump:live,format=b,file=/path/heap.bin 进程ID最后在eclipse中安装MAT插件(/mat/),然后在eclipse中,file---->open,打开这个文件heap.bin,利用现成的OOM工具进行分析。

相关文档
最新文档