jconsole – jconsole是基于 Management
Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。
jinfo –
jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。
jmap – jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm
size等等,目前只有在Solaris和Linux的JDK版本里面才有。
jdb – jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun
studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。
jstat – jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap
size和垃圾回收状况的监控等等。
jps – jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。
另外,还有些其他附带的工具在这里没有列出,比如Heap Analysis Tool, kill -3
方法等等,这些在JDK5.0之前就有,同样也是非常有用的性能调优工具,大家可以参照相应的文档资料来学习,在文章后面也会推荐一些相应的文档给大家作
为参考。
好,说了这么多,让我们来看看JDK5.0自带的这些工具在现实工作能给我们带来什么帮助,下面是我和ISV一起共同工作的实际例子,在这里把
它们简单阐述出来,希望对大家有所帮助。
jconsole和jstack使用实例:
在做过的项目中,曾经有几个是使用jstack和jconsole来解决问题的。在下面的例子中,由于部分代码涉及到公司名字,我使用了xxx来
代替。
1. 其中的一个是Web2.0的客户,由于目前Sun Microsystem公司推出的Niagara系列非常适合网络方面的多线程应用,并且已经在业界非常出名,所以他们决定使用T2000来一下如果应用到他们自己的
应用是否能够获得出众的性能。
整个应用的架构如下:
Apache 2.0.59 + Resin EE 2.1.17 + Jdk 1.5.0.07 + 9
运行的操作系统:
Solaris 10 Update 3 (11/06), EIS patches包.
October 12th, 2009
英文地址:
java VisualVM是一个图像用户界面,提供使用java技术的用的详细信息. 名字”java
VisualVM”来自于他提供了对JVM的视觉上的信息.
java VisualVM整合了一些监控,诊断,信息采集工具到一个里.
例如,jmap,jinfo,jstat和jstack的功能都整合到jvisualvm里. JConsole工具的的一些功能也可以通过选项加载.
jvisualvm的命令如下:
jvisualvm [options]
OPTIONS-J
传递参数给jvisualvm启动虚拟机
USAGE
java应用开发开发者可以使用java visualVM来诊断应用,监控提高应用的性能. java
VisualVM能够让开发者生成,分析heap dumps,跟踪内存泄漏, 执行,监控垃圾收集, 执行一些轻量级的memory,cpu信息采集.
Java VisualVM可以通过插件扩展功能. 例如,大多数的JConsole工具的功能通过MBeans Tab和JConsole
Plug-in的包装插件提供. 可以在Java VisualVM的Tools选项里选择你要的插件.
Categories: Tags: ,
September 30th, 2009
英文地址
jstatd工具是一个rmi的服务应用. 创建和结束jvms工具的代理,提供一个接口供远程监控工具分析本地的JVMs.
jstatd 服务需要本地存在一个RMI注册. jstatd服务将尝试依附于RMI注册,使用默认端口上,或者用-p指定的端口上.
假如rmi注册没有找到,jstatd应用将会创建一个使用指定端口或默认端口.
如果jstatd的参数指定了-nr选项,那么创建一个内部的RMI注册是被禁止的.
jstatd的命令如下:
options
-nr
当jstatd启动时没有找到存在的RMI注册,那么他不会尝试创建一个内部的RMI注册
-p port
期望的RMI注册端口号,或者自己创建的RMI注册的端口号
-n rminame
用来指定在RMI注册中的远程RMI对象的名字. 默认是JStatRemoteHost.
假如启动多个jstatd进程,那么就需要用这个参数指定名字以区分.
-Joption
传递将要启动jvm参数
security
jstatd服务只能在合适的内部访问权限下启动. 因此jstatd进程必须用启动JVMs的同用户启动.
一些用户的权限,如root用户拥有该机所有JVMs的访问权限,可以启动jstatd,但是会引入额外的安全问题.
jstatd服务没有为客户端提供任何验证. 所以他会把jstatd进程访问的jvms暴露给网络中所有的用户.
启动jstatd进程的时候需要考虑一下,你的网络是否安全,特别是在产品环境中.
在jstatd服务启动的时候引入一个policy文件将不会有任何安全的异常.
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
将以上内容保存到名为jstatd.all.policy的当前目录文件中
然后启动jstatd
jstatd -J-Djava.security.policy=jstatd.all.policy
examles:
jstatd -J-Djava.security.policy=jstatd.all.policy
jps 10.16.200.8
显示如下:
5866 Bootstrap
6572 Jstatd
6646 Jps
jstat -gcutil 5866@10.16.200.8 1000
显示如下:
S0 S1 E O P YGC YGCT FGC FGCT GCT
99.21 0.00 78.70 7.40 55.27 8 0.038 0 0.000 0.038
99.21 0.00 78.70 7.40 55.27 8 0.038 0 0.000 0.038
Categories: Tags: ,
September 28th, 2009
英文地址:
jstat是显示运行期jvm虚拟机行为统计的工具.
jstat的命令如下:
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
generalOption
假如你指定了一个一般的选项,那么不能指定其他的选项或参数.
-help 显示帮助信息
-version 显示版本信息(似乎用不了,报错”invalid argument count”)
-options 显示所有的统计选项列表.
output options
假如你没有指定一般的选项,那么你可以指定输出选项. 输出选项决定了jstat输出的内容和格式,
并也有一个单一的statOption(统计选项)加上任何其他的输出选项,如-h, -t, -J等. statOption必须出现在前面.
输出的格式如同一个table ,用空格隔开列信息. 第一行是每列的头信息描述. 使用-h选项可以指定头信息显示的频率.
也就是每几行显示一次头信息.
使用-t选项可以显示时间戳列,在输出的第一列显示. 时间戳列显示的时间是指该jvm实例从启动到现在的时间,单位是s(秒).
使用interval和count参数可以指定输出的频率和输出的次数.
-statOption
可以用jstat -options显示所有可用的statOption
class 显示class loader的行为统计
compiler 显示虚拟机即时的compiler行为统计
gc 显示堆的垃圾收集行为统计
gccapacity 显示jvm中各分区的容量和目前各分区占用的空间统计
gccause 显示垃圾收集的概要信息(和-gcutil一样),外加最近一次或当前的垃圾收集事件统计
gcnew 显示新生代的信息统计
gcnewcapacity 显示新生代容量信息统计
gcold 显示老生代和永久代信息统计
gcoldcapacity 显示老生代容量信息统计
gcpermcapacity 显示永久代容量信息统计
gcutil 显示垃圾收集的概要信息统计
printcompilation 显示虚拟机当前执行的方法的信息统计
-h
-t
-J
vmid格式
[protocol:][//]lvmid[@hostname][:port][/servername]
这个和jps中的格式类似,只不过在hostname前多了个进程号
Categories: Tags: ,
September 28th, 2009
英文地址:
jps是在目标系统里罗列正在运行中的java虚拟机实例的工具.
jps的命令如下:
options 命令选项
-q 输出时不显示类名,JAR文件名,实际上是主程序只处理产生当前vm的进程号的列表.
-m 显示传入主程序的参数. 在嵌入式jvm中,输出可能为空.
-l 显示应用启动类的全包名或应用启动包的全路径名
-v 显示传入JVM的参数,输出相对比-m少一些.
-V
显示通过flags文件传递给JVM的参数,如:.hotspotrc文件,或者用-XX:Flags=filename参数在jvm启动时传入的文件
-Joption 设定jps启动时的参数. 如: -J-Xms48m. 用-J为接下来要用java启动的应用传递参数是一个公共约定.
hostid
是指定主机. hostid还可以指定通信协议,端口号等
hostid的语法如下:
[protocol:][[//]hostname][:port][/servername]
protocol 通信协议.
假如protocol没指定,并且hostname也没指定,那么默认的protocol是平台特定的,最优化的本地protocol.
假如protocol没有指定,并且hostname是指定的,那么默认的协议用rmi.
hostname 一个主机名或ip地址,指向目标主机. 假如hostname没有,那么目标主机将是本地的主机.
port 和远程服务器通信的默认端口. 假如hostname没有指定或者protocol指定了最优的本地协议,那么port会被忽略.
否则port这个参数将要特别指定. 默认的rmi协议,端口指定的端口号是远程主机注册rmi是的端口号.
假如port没有指定,协议指定rmi,那么默认的rmi注册端口号1099将被使用.
servername 此参数的处理依赖于实现. 在最优化的本地协议下,这个参数是被忽略的.
在rmi协议下,这个参数是用来标识远程主机上RMI远程对象的名字字符串. 可以参见jstatd命令的-n参数.
output format
lvmid [ [classname] | [JARFilename] | [Unknown] [arg*] [jvmargs*] ]
Categories: Tags:
最近在搞64位系统的升级,搞了一台放到正是环境的pool中,在原先的32位下,我们定义的heap
size是1024m,其中permsize是96m,实用70m左右.同样的配置在64位jvm里,Perm
Generation直接暴掉,于是扩大至128m,实用稳定在108m左右,这里的原因是64位系统下,object占用了更大的内存,可以用
-XX:+UseCompressedOops参数压缩(java6好像还不支持),但是我们没有使用.
经过前几天的运行,系统还算稳定(经过上午,下午两个网上流量高峰期).昨天发布后,我在晚上19点半左右enable这台测试机,早上到了公司,观察了
一下运行情况.10点中左右发现jvm异常.
jstat -gcutil 22671 1000 1000
显示如下: