`

JVM监控常用工具

 
阅读更多

jstatd
启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
实例:jstatd -J-Djava.security.policy=my.policy

my.policy文件需要自己建立,内容如下:
grant codebase "file:$JAVA_HOME/lib/tools.jar" {
 permission java.security.AllPermission;
};
这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作。

如果上面的操作没有通过,出现:

Could not create remote object
access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.System.setProperty(System.java:727)
        at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)

create in your usr/java/bin the jstatd.all.policy file, with the content must be grant codebase "file:${java.home}/../lib/tools.jar" {  

permission java.security.AllPermission;  

}; 

 

在linux服务器按上面的配置设置好了,就可以在本地打开 jvisualvm

打开jvisualvm 界面如下:

右击远程 选择添加远程主机:

如果重新指定了jstatd端口,选择高级设置修改端口,如下图:

如果同时配置了JMX,可以在添加JMX连接如下图:

添加后如图所示:
 

 

options
-nr 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry
-p port 端口号,默认为1099
-n rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务
-J jvm选项

更多示例

1.使用默认端口1099 
  jstatd -J-Djava.security.policy=all.policy 
2.RMI Registry已经启动,不创建内部RMI Registry
  jstatd -J-Djava.security.policy=all.policy -nr
3.RMI日志能力
  jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true
4.指定hostname 一般情况需要重新指定hostname,否则连接不成功   
  jstatd -J-Djava.rmi.server.hostname=10.168.1.1 -J-Djava.security.policy=all.policy   
5.指定hostname 指定端口   
  jstatd -J-Djava.rmi.server.hostname=10.168.1.1  -J-Djava.security.policy=all.policy -p 8888  
6.启动JMX   
  jstatd -J-Djava.rmi.server.hostname=10.168.1.1 -J-Djava.security.policy=all.policy -J-Dcom.sun.management.jmxremote.port=8888  -J-Dcom.sun.management.jmxremote.ssl=false -J-Dcom.sun.management.jmxremote.authenticate=false  
7.后台启动   
  nohup jstatd -J-Djava.rmi.server.hostname=10.168.1.1 -J-Djava.security.policy=all.policy -p 8888 & 
--------------------------------------
2.使用外部RMI Registry
a)使用默认值
rmiregistry& jstatd -J-Djava.security.policy=all.policy
b)使用2020端口
rmiregistry 2020& jstatd -J-Djava.security.policy=all.policy -p 2020 
c)使用2020端口,使用rminame
rmiregistry 2020& jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName

 


jps
jps简单理解就是一个java版的ps,用来提供一些简单的jvm信息(进程ID,进程启动的路径,命令行参数等等)。

jps的语法格式如下
jps [ options ] [ hostid ]
options-- 命令行参数 ,可选
-q 不输出classname  或JARfilename
-m 输出main 方法的参数
-l  输出main class的类全名(包含package)或者jar的全路径
-v(小写) JVM输入参数
-V(大写)  输出通过标志文件传给JVM的参数

hostId是符合[protocol:][[//]hostname][:port][/servername]语法的字符串。    
protocol:协议,缺省时rmi    
hostname:主机名或IP地址,如果主机名忽略,就是localhost    
port: 端口如果hostId为空,jps会列出locahost上的Jvm进程信息。
命令输出lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
lvmId lvm进程ID
classname JVM启动类名
jarfilename  JVM启动的jar文件名
arg* 命令行参数
jvmarg jvm参数

$> jps -l
28729 sun.tools.jps.Jps
23789 com.asiainfo.aimc.bossbi.BossMain
23651 com.caucho.server.resin.Resin

 
jconsole
一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。

jinfo(linux下特有)
观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
实例:jinfo 2083
其中2083就是java进程id号,可以用jps得到这个id号。
可以通过jinfo的HeapDumpBeforeFullGCHeapDumpAfterFullGC参数来获取full GC前后的heap dump,并可以用HeapDumpPath这个参数指定heap dump的目录(-XX:HeapDumpPath=path/to/your/heap/dumps/dir) jinfo -flag +HeapDumpBeforeFullGC 18650 
jinfo -flag +HeapDumpAfterFullGC 18650 


jstack(linux下特有)
可以观察到jvm中当前所有线程的运行情况和线程当前状态
jstack 2083
输出内容如下:



jmap(linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
参数如下:
-heap
:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况(注意:会触发一次full GC)
-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中所有生存的对象的情况)。包括对象数量和所占空间大小。
输出内容:

写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。

jstat
最后要重点介绍下这个命令。
这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息
具体参数如下:
-class:统计class loader行为信息
-compile:统计编译行为信息
-gc:统计jdk gc时heap信息
-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件
-gcnew:统计gc时,新生代的情况
-gcnewcapacity:统计gc时,新生代heap容量
-gcold:统计gc时,老年区的情况
-gcoldcapacity:统计gc时,老年区heap容量
-gcpermcapacity:统计gc时,permanent区heap容量
-gcutil:统计gc时,heap情况
-printcompilation:不知道干什么的,一直没用过。

一般比较常用的几个参数是:
jstat -class 2083 1000 10 (每隔1秒监控一次,一共做10次)
输出内容含义如下:

 

 

Loaded Number of classes loaded.
Bytes Number of Kbytes loaded.
Unloaded Number of classes unloaded.
Bytes Number of Kbytes unloaded.
Time Time spent performing class load and unload operations.


jstat -gc 2083 2000 20(每隔2秒监控一次,共做10)
输出内容含义如下:

 

S0C Current survivor space 0 capacity (KB).
EC Current eden space capacity (KB).
EU Eden space utilization (KB).
OC Current old space capacity (KB).
OU Old space utilization (KB).
PC Current permanent space capacity (KB).
PU Permanent space utilization (KB).
YGC 新生代GC的次数
YGCT 新生代GC花费的时间
FGC Full GC的次数
FGCT 从应用启动到采样时Full GC花费的总时间(单位秒)
GCT Total garbage collection time.

输出内容:

 

分享到:
评论

相关推荐

    JVM之常用监控工具 - 副本.md

    JVM之常用监控工具 - 副本

    jvm常用命令工具

    ### jvm常用命令工具 #### 一、概述 在程序运行过程中,经常会出现各种各样的问题,例如性能瓶颈、内存泄漏、死锁等。为了快速定位并解决问题,我们需要收集多种类型的运行时信息,包括但不限于系统日志、堆转储...

    JVM监控管理及故障诊断工具(常用命令)

    本文将介绍三种常用的 JVM 监控管理及故障诊断工具:jps、jstat 和 jstatd。 1. jps - Java Virtual Machine Process Status Tool jps 命令用于列出目标系统上正在运行的虚拟机进程(每个 Java 程序会独占一个 ...

    JVM监控工具介绍.docx

    以下是几种常用的JVM监控工具的详细介绍: 1. **jstack**: `jstack` 是一个用于打印Java线程堆栈跟踪的工具,它可以帮助我们了解应用程序中线程的状态,比如是否发生死锁或者线程阻塞。通过指定进程ID,我们可以...

    JAVA JVM性能调优监控工具详解

    因此,掌握一些常用的JVM性能调优和监控工具对于Java开发者来说至关重要。本文将详细介绍几种常见的JVM性能调优工具,并通过实际案例帮助读者更好地理解和应用这些工具。 #### 一、jps (Java Virtual Machine ...

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    本篇将重点介绍几种常用的JVM监控工具,包括jstack、jconsole、jinfo、jmap以及jdb和jstat。 首先,`jstack`是一个用于打印Java线程堆栈跟踪的工具。当应用出现死锁或者线程阻塞时,jstack可以帮助我们查看各个线程...

    JVM性能调优监控工具1

    本文将详细介绍几个常用的JVM性能监控工具及其功能,包括Jinfo、Jstat、Jmap和Jstack。 1. **Jinfo**: Jinfo是一款用于查看和修改Java进程配置参数的命令行工具。它可以帮助开发者了解正在运行的Java应用程序的...

    JVM调优工具分享

    总的来说,JConsole和VisualVM都是强大的JVM监控工具,它们提供了丰富的功能来协助开发者进行性能优化。JConsole简洁易用,适合日常的基本监控;而VisualVM则更为全面,尤其在插件的支持下,可以进行深入的性能分析...

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

    本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,能够帮助我们解决各种 JVM 性能问题,如 OutOfMemoryError、...

    jvm工具、参数调优&调试技巧

    - **功能**:`jconsole` 是一个图形化的监控工具,可以监控本地或远程JVM的性能。 - **特点**: - 内存使用情况。 - GC详情。 - 类装载。 - 线程活动。 ##### 9. MemoryAnalyzerTool(MAT)Eclipse插件 - **...

    JVM常用指令手册JVM常用指令手册JVM常用指令手册

    最后,JVM的性能监控和调优是一个持续的过程,涉及到许多方面,如内存配置、线程管理、GC策略选择等。开发者应根据具体的应用场景和性能需求,灵活运用各种JVM指令进行调优。 总的来说,掌握JVM的常用指令和工作...

    JVM命令行监测工具详解

    为了监控和调试JVM的运行状态,Oracle提供了多个命令行工具,包括jps、jstack、jstat、jmap和jcmd。这些工具可以帮助开发者了解和解决性能问题,优化应用程序。 一、jps (Java Process Status) jps是查看当前系统中...

    jmx监控activeMQ监控

    在生产环境中, ActiveMQ的监控非常重要,jmx监控是其中一种常用的监控方式。 在ActiveMQ中开启jmx监控需要进行一些配置,包括编辑bin/activemq文件和conf/activemq.xml文件,以及设置jmx.password和jmx.access文件...

    JVM常用参数设置

    本文将深入探讨JVM的常用参数设置,以及它们如何影响Java应用程序的运行。 一、JVM内存设置 1. **堆内存**: - `-Xms`:初始堆大小,例如`-Xms256m`表示初始分配256MB内存。 - `-Xmx`:最大堆大小,例如`-Xmx...

    jvm分析资料及工具1

    在这里,我们将深入探讨JVM分析的相关知识点,并介绍一些常用工具。 1. **JVM内存模型**:JVM内存分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器...

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    通过JVM提供的各种工具,如JConsole、VisualVM、JProfiler等,可以监控和分析应用的内存使用、线程状态、CPU消耗等指标,从而发现潜在的性能瓶颈。此外,JDK自带的JMX(Java Management Extensions)和JVM命令行工具...

    常用的 JVM 性能调优监控工具,太强大了!.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...

Global site tag (gtag.js) - Google Analytics