Chinaunix首页 | 论坛 | 博客
  • 博客访问: 535028
  • 博文数量: 260
  • 博客积分: 10435
  • 博客等级: 上将
  • 技术积分: 1939
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 14:50
文章分类

全部博文(260)

文章存档

2011年(22)

2010年(209)

2009年(29)

我的朋友

分类: Java

2010-06-12 19:38:56

 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的命令如下:

jstatd [ options ]

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的命令如下:

jps [options] [hostid]

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:

November 21st, 2008

最近在搞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
显示如下:

1
2
3
4
5
6
7
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
0.00 0.00 100.00 100.00 84.71 17079 392.748 586 960.447 1353.195
0.00 0.00 100.00 100.00 84.71 17079 392.748 587 962.212 1354.960
0.00 0.00 100.00 100.00 84.71 17079 392.748 587 962.212 1354.960
0.00 0.00 100.00 100.00 84.71 17079 392.748 588 963.992 1356.740
0.00 0.00 100.00 100.00 84.71 17079 392.748 588 963.992 1356.740
0.00 0.00 100.00 100.00 84.58 17079 392.748 589 965.907 1358.655

jmap 22671
显示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Attaching to process ID 22671, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 10.0-b23
 
using thread-local object allocation.
Parallel GC with 8 thread(s)
 
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 268435456 (256.0MB)
MaxNewSize = 268435456 (256.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 134217728 (128.0MB)
MaxPermSize = 134217728 (128.0MB)
 
Heap Usage:
PS Young Generation
Eden Space:
capacity = 126615552 (120.75MB)
used = 126615552 (120.75MB)
free = 0 (0.0MB)
100.0% used
From Space:
capacity = 52494336 (50.0625MB)
used = 0 (0.0MB)
free = 52494336 (50.0625MB)
0.0% used
To Space:
capacity = 70909952 (67.625MB)
used = 0 (0.0MB)
free = 70909952 (67.625MB)
0.0% used
PS Old Generation
capacity = 805306368 (768.0MB)
used = 804698024 (767.4198379516602MB)
free = 608344 (0.5801620483398438MB)
99.92445806662242% used
PS Perm Generation
capacity = 134217728 (128.0MB)
used = 113520112 (108.26121520996094MB)
free = 20697616 (19.738784790039062MB)
84.57907438278198% used

在上面显示的数据中,full gc频繁发生,占用了大量的资源
eden Space和Old Generation的heap多已经使用100%
于是dump jvm
jmap -dump:file=dump_run.hprof 22671
java6和64位下dump速度比在java5和32下快很多,瞬间完成.拷贝到本地,在eclipse里用mat插件 ()查看,立即找到问题,如 图示:
null
昨日发布的一个变更设计有问题,出现了多份实例,没份实例占21m,共占用300m左右的内存.同样的情况在32位机器上表现的没有那么糟糕,似乎一切运 行正常,看来64位的指针和对象占用heap单位比32下大很多.

阅读(723) | 评论(0) | 转发(0) |
0

上一篇:Eclipse.ini参数配置

下一篇:firfox good plugin

给主人留下些什么吧!~~