一直没有做过jvm监控, 总以为要找些专门的工具才能做jvm监控, 如jprofile之类的工具, 但这类工具都是收费的。
经过查找,发现其实sun的jdk中就带有这类工具,从jdk5开始命令行有了jstat,jps,jstatd,图形监控有了jconsole;而到了jdk6,命令有了jmap, jinfo, jstack,图形有了jvisualvm。经过简单试用,这些命令+图形工具 已经足够强大, 能满足一般的监控要求了,如对各类内存、垃圾回收、线程状态的监控。
命令:
以下转自:http://hqman.iteye.com/blog/167796
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被允许作网络操作
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$ jps
6286 Jps
6174 Jstat
jconsole
一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。
jinfo(linux下特有)
观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
实例:jinfo 2083
其中2083就是java进程id号,可以用jps得到这个id号。
输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。
jstack(linux下特有)
可以观察到jvm中当前所有线程的运行情况和线程当前状态
jstack 2083
输出内容如下:
jmap(linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
参数如下:
-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中所有生存的对象的情况)。包括对象数量和所占空间大小。
输出内容:
写个脚本,可以很快把占用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也提供远程能力,
一般比较常用的几个参数是:
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 |
Number of young generation GC Events. |
YGCT |
Young generation garbage collection time. |
FGC |
Number of full GC events. |
FGCT |
Full garbage collection time. |
GCT |
Total garbage collection time. |
输出内容:
图形:
visualvm
http://www.iteye.com/topic/516447
如果是本地监控,则可以直接在本地的 窗口中看到java应用程序。双击点开即可打开监控窗口。
我们再看一下图1,左边的窗口中,第二个节点—Remote,它可以用来操作远程机器。远程机器需要启动一个daemon:jstatd
1、远程机器启动jstatd
1.1、首先需要准备一个java.policy文件,保存到如/home/admin/jstatd.java.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
|
1.2、启动jstatd
jstatd -J-Djava.security.policy=/home/admin/jstatd.java.policy -J-Djava.rmi.server.logCalls=true
|
1.3、同时需要执行一个命令看看(linux需要)
Hostname –i
如果显示是127.0.0.1,则需要修改/etc/hosts文件,去掉对本机名的配置,让本机名解析到它的IP地址,如10.20.131.214
|
2、连接远程机器
(图8)
3、点击OK,看到会连接到远程机器,并显示出它下面的java进程。
jconsole
http://www.blogjava.net/beansoft/archive/2006/12/13/87494.html
监控本地应用
首先就是启动您要监控的应用, 例如我用 JDK 1.6 来启动了 Tomcat, 或者 Eclipse 也可以, 可以在任务管理器(Ctrl+Alt+Del可以调出来, 或者在任务栏点击右键)里看到进程ID, 例如我这里是 6132.
接着在 JDK 安装目录中(<JDK_HOME>/bin/jconsole.exe)启动 jconsole.exe (双击或者在 cmd 里面敲入 jconsole), 主界面会提示您建立一个新连接:
可以看到进程ID, 选择它, 然后点击"连接". 这些 ID 必须都是用 JDK 1.6 的 java.exe 启动的, 否则在列表里看不到.
JConsle 能监控内存,线程,类的数目和CPU然后点击各个 Tab 可以看到详细的输出, 详细的输出包括:
内存: 堆/非堆, 峰值, 内存的各个部分, 例如 Perm, Eden 等的大小曲线图.
线程: 峰值, 所有线程的列表, 堆栈跟踪(哪个对象中的线程)等. 还可以强制执行GC.
类: 峰值, 类总数曲线图.
MBean: 一些 JVM 参数的详细 MBean 信息.
监控远程进程
首先需要在运行的应用上启用远程管理, 参数如下(简单期间就不加用户验证了):
java -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar ../demo/jfc/Java2D/Java2Demo.jar
然后连接的时候选择远程进程, 地址输入:
localhost:1090
即可.当然在别的电脑上(一般是局域网)可以输入那个电脑的IP.
综述: 使用 JConsole 可以简单的监控 Server 状态, 但是本身要占一定的资源, 不过 JVM 自带的监控, 理论上讲应该是占资源很小很小的, 可以用它来方便的了解 Web 服务器应用进程的状态. 如果要调优应用, 还是使用 JProfiler 等工具更好一些, 当然它们占的资源也更大.
a)使用 jps 查看远端机器有哪些 JVM 进程在使用当中,命令如下:
jps 172.25.1.24 // 远端机器的 IP 地址或名称
屏幕输入如下:
13686 Jstatd
14115 XXXJavaServer
15117 Jserver
b)从上面可以看到远端机器的 Jstatd 进程已经启动起来了。我们就可以使用 jstat 对相关进程的具体情况进行查看。
Jstat 命令用法如下:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
解释如下:
Option 包括以下选项:
-class
-compiler
-gc
-gccapacity
-gccause
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-printcompilation
Vmid 就是 jps 查看到的进程 id ,如上 Jserver 的进程 id 是 15117 。
Interval 是时间间隔,单位为毫秒, 1000 就是一秒。
Count 就是需要查看的次数。
例子假设我们需要查看 172.25.1.24 机器 vmid 为 15117 的 gc 的情况,可以输入下面的命令:
jstat -gc 15117@172.25.1.24 1000 3
然后你能看到四行信息(一行为 title ,剩下的就是你要的信息了),仔细看看就可以发现很多信息的了。
c) jstat还有一个可视化的监控包, 叫做jvmstat ,可以从sun的主页下载到。下载好了后,解压到任意目录。
执行 visualgc <pid> ,其实命令跟jstat很像,也可以监控到远程主机。然后就可以看到可视化的监控窗口。还挺酷的。
相关推荐
JAVA 编程题全集知识点总结 本资源提供了一个完整的 JAVA 编程题全集,涵盖了大量的题目和经典的解法,非常适合刷学完基础、刷题前的知识总结与开拓。以下是从资源中提取的重要知识点: 1. JAVA 基础知识:资源中...
Hbase JAVA编程开发实验报告以及代码,1 按照“Hbase应用开发实验1.pdf”中给出的说明,完成相关相关实验及JAVA程序的编写、调试和运行,提交JAVA源程序(AccessObject.java, HBaseTester.java, User.java)及运行...
通过以上内容的学习,学生将逐步建立起Java编程的知识框架,为后续更复杂的编程挑战做好准备。此外,课程还鼓励学生积极参与实践,通过实际编程项目来巩固所学,提高问题解决能力,最终形成具备职业竞争力的Java...
《高质量Java程序设计》是林锐的一本经典著作,它深入浅出地讲解了如何编写出高质量、可维护的Java程序。这本书对于Java开发者来说,是提升编程技能和理解Java精髓的重要参考资料。以下是对该书内容的一些关键知识点...
本资源“java程序设计例题全集”显然是一份涵盖了大学Java程序设计课程中各种实例的集合,旨在帮助学习者深入理解和掌握Java编程。 标题中的“java程序设计例题全集”意味着这份资料包含了大量关于Java编程的实践...
作为Java编程的入门示例,"Hello World"程序展示了最基本的程序结构。在实验中,学生被要求使用EditPlus和Eclipse分别编写并运行这个程序,输出"Hello World"。通过这个简单的例子,学生可以理解Java程序的基本框架...
[Wrox] Java 编程面试揭秘 英文版 [Wrox] Java Programming Interviews Exposed E Book ☆ 图书概要:☆ If you are a skilled Java programmer but are concerned about the Java coding interview process ...
该标签清晰地表明了该资源的主要内容是关于 JAVA 编程和程序设计的。该标签包括三个部分:java、开发、程序设计。 知识点: * JAVA 是一种编程语言,主要用于开发大型应用程序。 * JAVA 编程需要学习和掌握各种...
Java程序设计精讲课件是一套全面讲解Java编程的教育资源,主要涵盖了泛型、集合类、Java输入输出以及反射等核心概念。这套课程旨在帮助初学者深入理解和熟练掌握Java编程技术,同时也适合有一定基础的开发者进行知识...
在计算机软件开发中,Java编程语言的应用是极为广泛与深远的。Java语言自问世以来就以其独特的特性和优势吸引了大量开发者的注意,这些特性包括但不限于其平台独立性、内存管理优化、面向对象的编程设计以及其强大的...
本资源汇集了多个 Java 程序设计题目,涵盖了 Java 基础知识、控制结构、函数设计、面向对象编程等多方面的知识点。 1. Java 程序设计总复习题 1:编写一个 Java 程序在屏幕上输出“你好!”。本题目考察了 Java ...
课后答案可以帮助你验证对这些概念的理解,找出不足之处,加深对Java编程的掌握。同时,分享和讨论这些答案也能促进团队学习,共同进步。在实践中不断应用和反思,将理论知识转化为实际编程能力,是成为一名优秀的...
Java编程入门是计算机编程语言Java的基础学习指南,它向初学者介绍了Java编程语言的核心概念和基础知识。这份资料特别强调了Java编程在手机游戏开发中的应用,但其内容并不局限于此,而是包含了更广泛的Java基础知识...
这本书通过丰富的实例和练习,引导读者逐步掌握Java编程的核心知识,培养解决问题和设计程序的能力。 1. **Java基础知识**:书中首先介绍了Java语言的基础,包括语法特性、数据类型、变量、运算符、流程控制语句...
Java 编程语言的第一个程序 一、Java 基础知识 Java 是一种高级语言,用于开发大型应用程序。Java 的第一个程序是学习 Java 的基础,了解 Java 的基本概念和结构是非常必要的。 二、JDK、JRE、JVM 的关系 JDK...
Java编程是目前世界上最流行的编程语言之一,广泛应用于企业级应用开发、移动应用、Web应用等各个领域。Java语言之所以能够得到如此广泛的应用,主要得益于其众多独特的优势和特点。 首先,Java语言是一种面向对象...
Java编程的逻辑是软件开发领域中的重要组成部分,尤其对于初学者和有经验的开发者来说,深入理解Java语言的原理和逻辑至关重要。Java以其跨平台、面向对象和强大的库支持等特性,成为全球范围内广泛使用的编程语言之...
《清华Java程序设计实例教程》全面覆盖了Java编程的基础知识和面向对象编程的概念,结合实例帮助读者理解和应用。通过学习,读者不仅能够掌握Java语法,还能理解如何利用Java进行软件开发,包括异常处理、集合框架的...