最近一直在上项目,导致博主天天加班幸福感爆棚,有木有。
平时一直没有关注过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.