Archive for August 9th, 2007
Part I: How to use JConsole
by tonny.xu on Aug.09, 2007, under Java Tech
JConsole是一个JDK中提供的JVM监视与管理的工具,主要是通过JMX来提供监视与管理。
默认情况下,JVM是不启动JMX服务,并提供被监视与被管理的能力的,必须在启动Java程序之前,在Java [opt] [app]中指定JMX的服务。JConsole提供本地和远程的两种监管方式,远程又可以分为直接监视,另外一种是通过JMX的服务器来管理。
根据目前我的需要,我举一个很简单的远程监管例子。因为JConsole本身也要耗费一定的资源,所以用远程方式是比较推荐的。
首先启动JConsole:
(因为在日文系统中,所以显示的为日文)
选择下面的Remote Access,输入host:portNumb的格式,另外输入用户名和密码,用户名和密码存储在<JAVA_HOME>/lib/management目录下,将jmxremote.password.template 复制为management.jmxremote.password(如果需要可以将文件的只读属性打开)。注意:这个文件是放在JRE的lib目录下。修改过以后的内容大致如下:
######################################
# File permissions of the jmxremote.password file
######################################
# …monitorRole 333
controlRole 333
另外,默认情况下,SSL是被打开的,需要在被监视的机器上生成相应的SSL证书。在Java中可以使用keytool来生成,具体步骤如下:
- 在命令行输入 keytool -genkey
- 其次输入 keytool -certreq 来生成一个签名过的证书
- 将证书导入 keytool -import
- KeyTool具体的用法参考下面两个链接: (Solaris and Linux) (Windows).
- 以上第一个命令会产生一个.keystore的文件,保存在c:\documents and setting\<username>\.keystore
其中第三条将需要你将第二步生成的CSR文件提交给VeriSign这样公司验证,然后返回给你一个可以使用CER证书,然后在Import,我们主要目的是为了体验JConsole,所以这一步我们就略过。所以我们设定不使用SSL,具体设置如下:
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
注意:这两行将使用非认证,非SSL的情况,在真实的服务器上要小心,很容易留下漏洞的。
在Windows系统下,如果你将Tomcat安装为服务模式,则可以在右下角Tray 图标中点击配置Tomcat,可以在例如下图的属性中配置,非常的简单:
如果不使用Windows系统,则需要在Catalina.bat中改写Java运行的参数。
改完了Tomcat的配置,启动Tomcat。
在远程机器上点击JConsole的连接即可。JConsole的具体使用以及分析下次继续。
——————————————————-
JMX 的配置主要在Java程序启动的时候使用,这里重新整理了一下,更加清晰易懂一些:
方法1: 最简单的方式:不用密码,不用SSL
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=<define a random port>
方法2: 使用密码,不用SSL
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access在$CATALINA_BASE/conf/目录下添加jmxremote.password文件,并添加下面两行:
monitorRole <Your password>
controlRole <Your password>在$CATALINA_BASE/conf/目录下添加jmxremote.access文件,并添加下面两行:
monitorRole readOnly
controlRole readWrite
这两种方法是最简单的,并且第二种方法具有一定的安全性。具体可以参考Tomcat的文档:Monitoring
Java的性能调校
by tonny.xu on Aug.09, 2007, under Blog System
以前做Java的项目,基本上不会遇到对性能进行调校的事情,但是最近遇到了一个比较严重的问题。具体情况不便详细说,但是大致情况如下:
- Server: Intel Xeon Duo 2 *2
- Memory: 4G
- Disk: 3500G
- JDK: 1.5.0_02
- Web Server: Tomcat 5.5.19
- Application: Some kind of OpenSource Project A which contains about 27M’s package.
在Tomcat中配置了虚拟主机,运行了4份A的独立版本。运行起来以后,内存占用3G左右,在安装第5份的时候出现OutOfMemory的异常,由此引发了JVM性能调校的课题。
首先找到了一片比较浅显的文档:
- Java Tuning White Paper, Sun Microsystems, [live].
其中提到了性能调校的几个要点:
- 在所有对JVM的调校进行之前,先做以下的检查:
- 是否使用了最新的Java Release?
- Java是否更新到了最新的update?
- OS的补丁是否已经更新到最新?
- OS中是否还跑着其他许多不需要的应用程序?
- 其次对JVM进行以下的调校:
- 是否使用了Server HotSpot?
- 有没有使用并行GC?(ParallelGC)
- 初始化堆内存(heap size)大小是多少?推荐使用物理内存的1/64
- 最大堆内存(heap size)是多少?推荐使用物理内存的1/4
- 调校之前一定要准确的收集系统的运行情况数据并进行分析
- 可以参考使用JVM的管理与监视相关文档
在这样的指导下。我准备对我的系统做以下的操作步骤:
在Java tuning white paper中直接提到了一些GC调整的方式,在使用了ParallelGC以后,系统的运行确实能提高不少,但是具体的仍然有问题,等我的Monitoring和Profiling结束以后再报告。
Restart my blogging
by tonny.xu on Aug.09, 2007, under Blog System
Keeping going Tonny!
From Nov 2006 till now, I didn’t write a single post, and now, I gonna restart my blogging life.
and I will stick to blogging until I feel tired again.