JVM常用分析工具JPS/JINFO/JSTACK/JSTAT/JMAP详解

最近一直在上项目,导致博主天天加班幸福感爆棚,有木有。

平时一直没有关注过JVM,最近上了一个新的项目,它对内存的需求量比较大,导致目前项目在用的JVM参数不能满足他的需求。起初还没发现是这方面问题,后来在启动的时候报错了,一报错不要紧,要紧就要紧在博主我要调整JVM的参数了。调整参数也不要紧,更要紧的是调不对很让我着急。

因此,我就百谷了下,对JVM的相关内容突击了一下,受益匪浅啊。

废话不扯了,下面就是我的学习笔记啦。本篇博文就和大家分享下平时去分析JVM以及排故障时需要用到的几款工具。

目前常用的几款工具有jps、jinfo、jstack、jstat和jmap等,这里就介绍这几款喽。

jps

用来查看所有的jvm进程,包括进程ID,进程启动的路径等。博主平时都是用ps过滤的。

jinfo负责观察进程运行环境参数,包括Java System属性和JVM命令行参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息

jstack

用来观察 jvm 中当前所有线程的运行情况和线程当前状态。
当系统崩溃时,如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java sta

ck和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
当系统hung住时,jstack工具可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

jstat

利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。

jmap

用来监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量。当系统崩溃时,jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等。


   以上就是几个常用工具的简介喽,平时工作环境中(linux环境),通过这几个命令再结合常用的文本处理工具(sed、awk)可以快速查看到自己感兴趣的数据,是不是很赞啊。

   下面就针对每一个工具,展开进行介绍。

=========================== 分 割 线 ================================================

JPS命令

**jps(Java Virtual Machine Process Status Tool)**是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。
ps命令我们经常用到,这个命令主要是用来显示当前系统的进程情况。比如有哪些进程及其 id。jps命令也是一样,它的作用是显示当前系统的java进程情况及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例)以及他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。

用法:

jps [-q] [-mlvV] [<hostid>]

常用选项:

-q    安静,只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
-m   输出传递给main 方法的参数,在嵌入式jvm上可能是null
-l (显示完整路径)
-v (显示传递给JVM的命令行参数)
-V (显示通过flag文件传递给JVM的参数)
hostid是主机id,默认localhost

例子:

[root@autorepair-web01-rj autorepair-web01-rj.btr /home/apps/repair-web] 

jps

4214 Bootstrap 
18096 jar 
26423 Jps 
[root@autorepair-web01-rj autorepair-web01-rj.btr /home/apps/repair-web] 

jps -q

4214 
18096 
26438 
[root@autorepair-web01-rj autorepair-web01-rj.btr /home/apps/repair-web] 

jps -m

4214 Bootstrap start 
18096 jar 
26453 Jps -m 
[root@autorepair-web01-rj autorepair-web01-rj.btr /home/apps/repair-web] 

jps -l

4214 org.apache.catalina.startup.Bootstrap 
18096 logmon.jar 
26468 sun.tools.jps.Jps 
[root@autorepair-web01-rj autorepair-web01-rj.btr /home/apps/repair-web] 

jps -v

4214 Bootstrap -Djava.util.logging.config.file=/usr/local/apache-tomcat-7.0.53/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms2560m -Xmx2560m -Xmn680m -Xss256k -XX:PermSize=240m -XX:MaxPermSize=240m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Djava.endorsed.dirs=/usr/local/apache-tomcat-7.0.53/endorsed -Dcatalina.base=/usr/local/apache-tomcat-7.0.53 -Dcatalina.home=/usr/local/apache-tomcat-7.0.53 -Djava.io.tmpdir=/usr/local/apache-tomcat-7.0.53/temp 
18096 jar -Xms64m -Xmx64m -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 
26483 Jps -Denv.class.path=.:/usr/local/jdk/lib/dt.jar:/usr/local/jdk/lib/tools.jar -Dapplication.home=/usr/local/jdk1.7.0_55 -Xms8m 
[root@autorepair-web01-rj autorepair-web01-rj.btr /home/apps/repair-web] 

jps -V

4214 Bootstrap
26512 Jps
18096 jar
详细情况请参考官方文档:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html

JINFO命令

   jinfo命令用来输出给定 java 进程的所有配置信息,包括 java 系统属性和 jvm 命令行标记等。

用法:

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP

常用选项:

-flags         打印命令行参数
-sysprops      打印系统属性

常用参数:

pid   进程号
executable    产生 core dump 的 java executable
core   core file
remote-hostname-or-IP   主机名或ip
server-id   远程主机上的debug server的唯一id

例子:

[root@autorepair-web01-rj autorepair-web01-rj.btr /home/apps/repair-web] 

jinfo 4214 # 这个命令包含了 JDK 和 JVM 运行起来时的一些属性

Attaching to process ID 4214, please wait... 
Debugger attached successfully. 
Server compiler detected. 
JVM version is 24.55-b03 
Java System Properties: 

java.runtime.name = Java(TM) SE Runtime Environment 
java.vm.version = 24.55-b03 
sun.boot.library.path = /usr/local/jdk1.7.0_55/jre/lib/amd64 
shared.loader = 
java.vendor.url = http://java.oracle.com/ 
java.vm.vendor = Oracle Corporation 
path.separator = : 
file.encoding.pkg = sun.io 
java.vm.name = Java HotSpot(TM) 64-Bit Server VM 
java.util.logging.config.file = /usr/local/apache-tomcat-7.0.53/conf/logging.properties 
tomcat.util.buf.StringCache.byte.enabled = true 
sun.os.patch.level = unknown 
sun.java.launcher = SUN_STANDARD 
user.country = US 
user.dir = /home/apps/repair-web 
java.vm.specification.name = Java Virtual Machine Specification 
java.runtime.version = 1.7.0_55-b13 
org.apache.catalina.startup.TldConfig.jarsToSkip = tomcat7-websocket.jar 
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment 
os.arch = amd64 
java.endorsed.dirs = /usr/local/apache-tomcat-7.0.53/endorsed 
line.separator = 

java.io.tmpdir = /usr/local/apache-tomcat-7.0.53/temp 
java.vm.specification.vendor = Oracle Corporation 
java.util.logging.manager = org.apache.juli.ClassLoaderLogManager 
java.naming.factory.url.pkgs = org.apache.naming 
os.name = Linux 
sun.jnu.encoding = UTF-8 
java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 
tomcat.util.scan.DefaultJarScanner.jarsToSkip = bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,websocket-api.jar,catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-tribes.jar,jasper.jar,jasper-el.jar,ecj-*.jar,tomcat-api.jar,tomcat-util.jar,tomcat-coyote.jar,tomcat-dbcp.jar,tomcat-jni.jar,tomcat-spdy.jar,tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,tomcat-juli-adapters.jar,catalina-jmx-remote.jar,catalina-ws.jar,tomcat-jdbc.
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值