运用Jconsole监控JVM

Jconsole 是JDK自带的 监控 工具,在JDK/bin目录下可以找到。它用于连接正在运行的本地或者远程的 JVM ,对运行在 java 应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。而且本身占用的服务器内存很小,甚至可以说几乎不消耗,不失为一款好工具。
Jconsole的使用方法,稍微复杂一些。
首先,来看看如何使用Jconsole 连接到远程linux服务器。
1. 在本地安装JDK 6.0版本。
2. 需要在远程服务器的jboss配置文件中,添加远程服务端口,并启动jboss。如下:
JAVA_OPTS=”$JAVA_OPTS -Djava.awt.headless=true -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=$HOSTNAME”
3. 在本地java/bin目录下找到jconsole.exe文件,运行。打开界面后,就可以连接了。
运用Jconsole监控JVM - zhuzhu - 五事九思 (大连Linux主机维护)
4. 当Jconsole连接成功后,它从JMX获取信息,我们便可以在里面监控具体的内容。
接下来,看一下这个工具的总括。
Jconsole能捕获到以下信息:
概述 - JVM概述和一些监控变量的信息
内存 - 内存的使用信息
线程 - 线程的使用信息
类 - 加载java类的信息
VM - JVM摘要
MBeans - 所有MBeans的信息

有了上面的概念之后, 性能测试 过程中需要关注哪些信息呢?一般主要关注内存栏、线程栏、类栏,概述栏和VM栏次之,MBeans栏在追踪具体问题时用到。下面详细说明一下使用方法。

1. 内存栏
内存栏中显示了内存堆栈消耗情况、内存池分区统计情况、垃圾回收情况等内容,并以图表实行显示出来。点击图表下拉框,可以选择具体需要的图。
运用Jconsole监控JVM - zhuzhu - 五事九思 (大连Linux主机维护)
在这里,还可以强制执行GC,另内存回收更加爽歪歪!

2. 线程栏
线程栏中显示了当前运行的线程,并以图表实行显示出来。对于启用多线程系统分析,非常有用。例如,它可以协助我们追踪线程状态、线程阻塞、线程等待、线程挂起、线程资源争用问题。
运用Jconsole监控JVM - zhuzhu - 五事九思 (大连Linux主机维护)

3.类栏
类栏中显示了当前加载类的信息。并以图表实行显示出来。如果要了解当前载入类的数量、已载入类的总数量、已卸载类的总数量,在这里查看非常有用。
运用Jconsole监控JVM - zhuzhu - 五事九思 (大连Linux主机维护)

工具的使用,就介绍到这里。这款工具的好处在于,占用系统资源少,而且结合上期提到的Jstat,可以有效监控到java内存的变动情况,以及引起变动的原因。在项目追踪内存泄露问题时,很实用。
但是它也有缺点,就是采集的信息比较难分析,不如JProfiler直观,需要有专业基础才能看得懂。


使用Jconsole远程监控tomcat情况,开启远程监控是比较简单的,只是开启几个设置选项就行了。我使用的是centos系统安装的默认的tomcat6,那么我只需要修改/etc/tomcat6/tomcat6.conf这个文件,在这个文件中找到JAVA_OPTS这个设置,在里面增加如下内容:

   
   
  1. -Djava.rmi.server.hostname=192.168.1.100
  2. -Dcom.sun.management.jmxremote.port=9090
  3. -Dcom.sun.management.jmxremote.ssl=false
  4. -Dcom.sun.management.jmxremote.authenticate=false

 

我这边修改后的结果如下:

   
   
  1. JAVA_OPTS="-Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djmagick.systemclassloader=no -Djava.rmi.server.hostname=192.168.1.100"

 

这个里面要注意一点就是-Djava.rmi.server.hostname=192.168.1.100,去掉了这个可能连接不上。
接下来就是使用jconsole来建立连接了,如下图所示:

Jconsole建立连接
Jconsole建立连接

监控界面如下:
监控界面



 JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。

好处:

通过GUI直接查看jvm环境
监视内存,解决内存溢出

查看系统的 堆,非堆,线程
监控内存、线程、执行GC、查看JVM堆栈

 

jconsole配置

1,tomcat  在windows下
如果你是用tomcat,在catalina.bat来设置
set JAVA_OPTS=%JAVA_OPTS%  -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=7080 -Dcom.sun.management.jmxremote

 

2,tomcat 在linux 下  catalina.sh 
无密码 无ssh
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=7080 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=122.22.192.1xx"

authenticate 单用户,(多用户的话com.sun.management.jmxremote.password.file=pwFilePath)
jre/lib/management/jmxremote.password
monitorRole and controlRole   open

monitorRole QED
controlRole R&Daa

官方文档
http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdenv

3,使用jconsole远程监控jvm环境

如配置好了全局环境 本地dos直接打开jconsole,或者去jdk/bin 下双击打开

 

运用Jconsole监控JVM - zhuzhu - 五事九思 (大连Linux主机维护)

连接后

运用Jconsole监控JVM - zhuzhu - 五事九思 (大连Linux主机维护)

 

 

VisualVm

VisualVM是Sun的一个OpenJDK项目,其目的在于为Java应用创建一个整套的问题解决工具。该工具由几个现有工具和新增功能合并而成的(如jvmstat、JMX、Attach API等)构成。VisualVM可以作为独立应用运行,或者通过其良好的API进行扩展。

在Java SE for Business的特性和优势页面上,VisualVM被描述为可以胜任如下任务的工具:

比以往任何时候都更快更容易地在已部署的应用中追踪导致可靠性、可用性或者可扩展性问题的根源。

根据VisualVM项目站点所述:

该工具的设计目标就是既可以在产品环境下使用,也可以在开发阶段使用,并且进一步加强了对Java SE平台的监控能力和性能分析能力。

它对JDK1.4.2、5.0及6.0都提供了支持,但是对JDK6.0的支持是最大的。一些特性列举如下:

分析

Thread Dump

Heap Dump

分析快照

应用快照

http://visualvm.java.net/zh_CN/gettingstarted.html   官方文档

http://java.net/downloads/visualvm/release132/visualvm_132.zip  

VisualVm下载地址


运用Jconsole监控JVM - zhuzhu - 五事九思 (大连Linux主机维护)

远程主机配置Using Internal RMI Registry

启动jstatd

1 ,在jdk环境目录下建立jstatd.all.policy

cat /usr/local/java/jstatd.all.policy

grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};

2, hostname 更改

cat /etc/hosts
将ip绑定hostname不然主机会调不上本地jstatd端口的

Could not create remote object
Port already in use: 1099; nested exception is:
 java.net.BindException: Address already in use
java.rmi.server.ExportException: Port already in use: 1099; nested exception is:
 java.net.BindException: Address already in use
 at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:310)
 at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:218)
 at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:393)
 at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:129)
 at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:190)
 at sun.rmi.registry.RegistryImpl.setup(RegistryImpl.java:92)
 at sun.rmi.registry.RegistryImpl.<init>(RegistryImpl.java:78)
 at java.rmi.registry.LocateRegistry.createRegistry(LocateRegistry.java:186)
 at sun.tools.jstatd.Jstatd.bind(Jstatd.java:48)
 at sun.tools.jstatd.Jstatd.main(Jstatd.java:126)
Caused by: java.net.BindException: Address already in use

 

注意jmxremote.password 权限要设置

Chmod 600  不然会出错,从而启动不了resin

Error: Password file read access must be restricted: /usr/java/jdk1.6.0_23/jconsole/jmxremote.password

Error: Password file read access must be restricted: /usr/java/jdk1.6.0_23/jconsole/jmxremote.password

3,启动jstatd

jstatd -J-Djava.security.policy=jstatd.all.policy  或者-p 6080 添加指定端口6080

建议扔后台

 

本机调用

romote 右键 ADD即可

visualvm 插件安装 gc  mbeans

 




Jconsole是JDK自带的一个很好的jvm查看工具,免费不用说,而且内存状态刷新的快,垃圾回收也快。由于,需要监控一个即将上线的web应用是否有内存泄露,即需要监控tomcat的jvm内存状况。Jconsole是基于jmx进行通信、信息发送获取的,因此需要对tomcat进行相应设置,jconsole才可监控tomcat。

1、windows下,通常是我们的开发环境

Windows下,通常是我们的开发环境设置tomcat相关参数,首先反应是修改catalina.bat等文件,我个人意见这些启动文件能不改尽量不改,没多大好处。幸运的是,我们现在java开发基本上都是基于eclipse或者myeclipse的,因此只要的eclipse或者myeclipse服务器配置中,设置tomcat服务器的启动参数即可。

如myeclipse8.5,windows—>preferencesàmyeclipseàserversàtomcat6,在其JDK optional java vm arguments设置中,输入下述内容即可:

-Xmx256m -Xms128m -Djava.rmi.server.hostname=192.168.10.101 -Dcom.sun.management.jmxremote.port=8061 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

设置完毕后,在myeclipse中启动tomcat,我们即可启动jconsole连接 192.168.0.1:8061进行tomcat的jvm内存监控。

2、linux下

现在,大多数生产机的tomcat应用都是部署在linux或者unix机器上,windows上很少,本文以linux为例。

还是基于我刚才的原则,不修改catalina.sh等启动文件。我们手工创建一个start文件,内容如下:

JAVA_HOME=/usr/java/jdk1.6.0_06/ TOMCAT_HOME=/usr/java/apache-tomcat-6.0.16 PATH=$JAVA_HOME/bin:TOMCAT_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH 
CATALINA_OPTS="-Xmx3072m -Xms3072m -Djava.rmi.server.hostname=192.168.1.101 -Dcom.sun.management.jmxremote.port=8061 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=$JAVA_HOME/jre/lib/management/jmxremote.password" export CATALINA_OPTS /usr/java/apache-tomcat-6.0.16/bin/startup.sh

将start文件存放到tomcat bin目录下,则我们只要以下指令即可启动tomcat:

at –f /usr/java/apache-tomcat-6.0.16/bin/start       now

由于是生产机的设置,因此设置Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=$JAVA_HOME/jre/lib/management/jmxremote.password,jconsole连接192.168.1.101:8061时需要用户名和口令验证,确保安全性。

实际上会用到2个文件,jmxremote.access文件和jmxremote.password文件,前者设置用户,后者设置用户及对应的口令。这连个文件在$JAVA_HOME/jre/lib/management都有,我们只要修改其中的用户和口令即可。


这里一个需要特别注意的是jmxremote.password访问权限一定要设置好,设置成owner可读即可,否则tomcat启动失败,会报类似jmxremote.password resticted错误。


(--***-曾经受过的伤,觉得一辈子也忘不了,可还是都过来了。
             曾经离开的人,以为一辈子也放不开,可后来还是发现,原来真的不会,离开谁就活不下去。
             曾经说着的梦想,你也没能实现,可是却在实现梦想的努力中,找到了喜欢的那个自己。
-***-)


jconsole+tomcat配置说明(基于jdk5.0)

最近需要参与一些java程序debug和性能调整方面的工作,jconsole是jdk自带的工具,比较好用,以下文章前面大部分翻译自: ,后面关于用户名/密码和使用ssl加密连接的部分是从其他地方搜集的资料并且进行了验证。

Jconsole简介:

Jconsole是一个JMX兼容的监视工具。它使用Java虚拟机的JMX机制来提供运行在Java平台的应用程序的性能与资源耗费信息。

开始jconsole

Jconsole应用程序位于JDK_HOME/bin目录下。

命令语法:

可以使用jconsole监视本地应用程序和远程应用程序。

注意:在开发阶段或者原型阶段,使用jconsole监视本地应用程序是很有用的,但是不建议在生产环境中使用,因为jconsole本身也将显著的消耗系统资源。推荐使用远程监视来将jconsole和被监视平台孤立开。查看jconsole详细语法:.

本地监视:

如果需要监控本地应用程序,那么启动jconsole使用的用户id必须和被监视程序的用户id一致。启动本地监控的命令语法如下:

Jconsole [processed]

得到进程号(PID)的办法:

Unix/Linux:使用ps查看java进程的PID

Windows:任务管理器查看java或者javaw进程的PID

也可以使用jps命令行工具 查看PIDs

例子:如果你发现notepad.jar应用程序的PID为2956,则可以通过如下命令启动jconsole:

jconsole 2956

jconsole和被监视的应用程序必须是使用同一个用户运行的。管理和监视系统使用操作系统的文件权限。

如果你没有指定PID,jconsole会自动的探测出本地运行的所有java应用程序并显示一个对话框让你选择你想监控的程序(见下一节)

远程监视:

使用如下命令启动jconsole进行远程监视:

jconsole [hostname:portNum]

Hostname是被监控系统主机名,portNum是当你启动JVM,打开JMX代理之后指定的端口号。详细信息见:

如果你没有指定主机名/端口号,那么jconsole会显示一个连接对话框(见下一节)来输入主机名和端口号。

连接JMX代理:

如果在启动jconsole的时候指定了要连接的JMX代理,它会自动的启动对指定JVM的监视。任何时候如果你想连接到另外一台主机,可以选择:Connection | New Connection并输入连接信息。

或者如果你没有输入代理,那么启动jconsole之后会出现连接对话框,对话框有三个tab页:

Local

Remote

Advanced

Local选项卡

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

Local选项卡列出了在本地系统上,使用与启动jconsole相同的用户运行的JVM及其PID、类/参数信息。选择需要坚实的应用程序,然后点击Connect

Remote选项卡

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

要监视远程JVM,需要输入:

Host name:远程主机名

Port number:启动JVM的时候指定的JMX代理(agent)端口号。

User name and password:使用的用户名和密码(仅在通过需要用户名/密码的 JMX代理监视JVM时需要)

关于设置JMX代理端口号的详细信息,见:

关于用户名和密码的详细信息,见:

要监视JVM本身使用的JVM,仅需设置主机名为localhost,端口号为0,然后点击Connect即可。

Advanced选项卡

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

利用Advanced选项卡,你可以通过输入JMX URL及其用户名密码来连接其他JMX代理(MBean Servers),JMX URL的语法在如下链接:

注意:如果JMX代理在使用一个未包含在Java平台中的连接器(connector),你需要在运行jconsole时将connector classes加入到classpath中,如下:

jconsole –J-Djava.class.path=JAVA_HOME/lib/jconsole.jar:JAVA_HOME/lib/tools.jar:connector-path

Jconsole界面:

Jconsole界面由以下六个选项卡组成:

Summary选项卡:显示JVM和被监视值的汇总信息

Memory选项卡:显示内存使用信息。

Threads选项卡:显示线程使用信息。

Classes选项卡:显示类(class)加载信息。

MBeans选项卡:显示MBeans信息

VM选项卡:显示JVM信息。

以下是详细介绍:

查看汇总信息:

Summary选项卡显示了关于线程使用、内存消耗和class加载的一些关键监视信息,以及JVM和操作系统的信息。

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

Uptime:JVM已运行时长。

Total compile time:花费在即时编译(JIT compilation)中的时间。

Process CPU time:JVM花费的总CPU时间。

Live threads:当前活动的daemon线程加non-daemon线程数量。

Peak:自JVM启动后,活动线程峰值。

Daemon threads:当前活动的Daemon线程数量。

Total started:自JVM启动后,启动的线程总量(包括daemon,non-daemon和终止了的)

Current heap size:堆(heap)占用的内存量,以K为单位。

Committed memory:为堆分配的内存总量

Maximum heap size:堆占用的最大内存量。

Objects pending for finalization:等待析构(finalization)的对象数量。

Garbage collector information:GC信息,摆阔垃圾回收器名称,已执行的垃圾回收次数和执行垃圾回收总耗时。

Current classes loaded:当前被加载到内存的classes数量

Total classes loaded:自JVM启动后被加载到内存的classes总量,包括后来卸载的。

Total classes unloaded:自JVM启动后,从内存卸载的classes总量。

Operating System:

Total physical memory:物理内存总量

Free physical memory:物理内存空闲量

Committed virtual memory:为运行中的进程分配的虚拟内存总量

监视内存消耗:

Memory选项卡提供了内存消耗和内存池信息。

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

以上图表显示了JVM的内存使用和时间的对应关系,包括heap和non-heap内存以及指定的(specific)内存池。内存池种类与具体使用的JVM有关,以HotSpot JVM为例,内存池有:

l Eden Space(heap):大多数对象初始化时从Eden Space池分配内存,即是存在于此池中

l Survivor Space(heap):此池包含的对象是那些原先在eden space中,但是已经经历过垃圾回收而仍然存在的对象。

l Tenured Generation(heap):在surviver space中已经存在了一段时间之后的对象会移动到这个池中。

l Permanent Generation(non-heap):包含虚拟机自身的所有反射数据。比如class和mothod对象。对于使用的JVM,这一代分为只读和读写两个区域。

Code Cache (non-heap):HotSpot JVM也包含一个“代码缓存”,是编译和存储本地代码所占用的内存。

查看关于内存池的详细信息:

Detail区域显示了几种当前内存度量:

Used:当前使用的内存总量。使用的内存总量是指所有的对象占用的内存,包括可达和不可达的对象。

Committed:JVM可使用的内存量。Committed内存数量可能随时间变化而变化。JAVA虚拟机可能将某些内存释放,还给操作系统,committed内存可能比启动时初始分配的内存量要少。Committed内存总是大于等于used内存。

Max:内存管理可用的最大内存数量。此值可能改变或者为未定义。如果JVM试图增加使用内存(used memory)超出了committed内存,那么即时使用内存小于或者等于最大内存(比如系统虚拟内存较低),内存分配仍可能失败。

右下角的图表显示了内存池在heap和non-heap消耗的内存量。当内存使用超出了内存使用阀值时,柱状图会变红。你可以通过设置MemoryMXBean的一个属性来调整内存占用阀值。

Heap and Non-heap内存

JVM管理两种内存:heap和non-heap内存,两种内存都是在JVM启动时建立。

Heap memory 是运行时数据区域,用于JVM为所有对象实例和队列分配的内存。Heap可能为固定植或者可变值。垃圾收集器是一个用于回收对象占用的heap内存的自动化内存管理系统。

Non-heap memory 包含一个在所有线程共享的方法区域(method area)和内部进程或JVM优化所需的内存。它存储了每一个类的结构,比如运行常量池,字段和方法数据,构造函数和方法的代码。方法区域逻辑上是 heap的一部分,但是依赖于实现,JVM可能不进行垃圾收集或压缩。像heap一样,方法区域可能为固定或可变大小。方法区域所需要的内存没有必要是连 续的。

除了方法区域之外,一个JVM实现的内部进程或优化所需的内存也属于non-heap内存。比如JIT编译器为了提高性能而用于存储本地机器码所需的内存。

内存池(Memory pools)和内存管理器是JVM内存管理系统的关键部分

一个内存池(memory pool)代表JVM管理的一块内存区域。JVM拥有最少一个内存池,JVM在运行中可能创建或删除内存池。一个内存池可以属于heap内存或者non-heap内存。

内存管理器(memory manager)管理一个或多个内存池。垃圾回收其是一种负责回收被不可打对象占用的内存的内存管理器。一个JVM可以拥有一个或者多个内存管理器。JVM在运行中可能增加或删除内存管理器。一个内存池可以被多于一个内存管理器管理。

垃圾收集:

垃圾收集(GC)是指JVM释放那些被无引用对象占用的内存空间。它通常认为那些有活动引用的对象是“活”对象,而那些没有引用或不可达的对象为“死”对象”。垃圾收集是释放被死对象占用的内存的过程。GC的算法和参数对性能有巨大的影响。

HotSpot VM垃圾收集器使用 分代垃圾收集(generational garbage collection)。分代GC利用了大多数程序中,从经验看有如下特点:

很多对象有一个很短的生存期(比如迭代器iterators、本地变量)

某些对象拥有很长的生存期(比如高层持久化对象)

所以,分代的GC将内存划分为代(generations)并且赋予每一个内存池。当一代用尽了分配的内存,VM会在那个内存池进行一次局部 (partial)的垃圾收集(或者叫minor collection)来收集被死对象占用的内存。局部垃圾收集比全垃圾收集(full GC)快的多。

HotSpot VM定义了2代:young generation (有时叫做nursery)和old generation。Young generation由一个eden space和两个survivor spaces组成。最初,VM将所有的对象放入eden space,大多数对象死在那里~~~,当VM运行了一次minor GC,VM将剩余的对象从eden space移动到某个survivor space中。然后VM将那些在survivor spaces中生存了足够长时间的对象移动到位于old generation中的tenured spaces。当tenured spaces满了以后,将发生一次full GC,full GC涉及到所有存活的对象,因此比较慢。Permanent generation保存了所有的虚拟机自身的反射数据,比如class和method objects

默认情况下代的排列类似于下图:

如同下文链接中说明的,如果垃圾收集器成为瓶颈,你可以通过自定义代大小来提高性能。使用jconsole可以发现你的性能情况对垃圾收集器参数的敏感程度。详细情况见:

监视线程使用:

线程选项卡提供了关于线程使用的信息。

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

左下角列出的为所有的活动线程。如果你在过滤(filter)对话框输入字符串,那么线程列表将尽显示那些包含你输入字符串的线程。在线程列表上点击线程名,可以显示在右侧显示县城信息,包括线程名,状态和调用堆栈。

图表显示了活动线程/时间。有三行内容:

Magenta:线程总数

Red:峰值线程数

Blue:活动线程数。

关于线程、daemon线程详细信息,请查看链接:

监视Class加载:

Classes选项卡显示了关于class loading的信息:

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

图表显示了 类加载/时间

红线是类加载总数(包括后来卸载的)

蓝线表示当前的类加载数量。

选项卡底部的Detail节显示了自JVM启动后类加载的总量,当前加载量和卸载量。

监视和管理MBeans:

MBean选项卡显示了所有在platform MBean server上注册的MBeans的信息。

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

左边的树形结构显示了所有的MBean,按其对象名排序。当在树种选择了一个MBean之后,其属性、操作、通知和其他信息会在右边显示。

如果属性值是可写的(可写会蓝色显示),你可以设置属性值。你也可以调用在操作选项卡中显示的操作。

显示图表:

你可以通过双击属性值的方法显示一个属性值/时间图表,比如,如果你双击java.lang.GarbageCollector.Copy Mbean的CollectionTime属性,你会得到如下图所示的显示:

查看VM信息。

VM选项卡提供了JVM的信息。

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

这些信息包括:

Uptime:JVM启动后的总时间。

Processes CPU Time:JVM启动后消耗的总CPU时间。

Total Compile Time:即时编译(JIT compilation)消耗的总时间。JVM的具体实现决定JIT编译何时发生。Hotspot VM使用adaptive compilation,在这种方式zhogn ,VM使用标准的解释器(interpreter)运行一个应用程序,但是会分析其代码判断性能瓶颈或者”hot spots”。

配置tomcat使用jconsole修改catalina脚本

Windows平台:修改catalina.bat,在dorun和dostart段开头增加一行(注意是一行):

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port="9004"

-Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote.ssl="false"

Unix/Linux平台:修改catalina.sh,在dorun和dostart段开头增加一行(注意是一行):

JAVA_OPTS="$JAVA_OPTS "-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port="9004"

-Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote.ssl="false"

启动jconsole

启动tomcat之后,根据上文中的jconsole简介中的命令启动jconsole,如果是在服务器本地运行jconsole,会出现如下界面:

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

直接进行连接即可。

如果是远程监控,需要点击远程选项卡并输入相关信息,示例如下:

jconsole+tomcat配置说明(基于jdk5.0) - bluestar - JavaEye技术网站 - 夏 - 隨心漂泊~~~

“主机名或ip”处填写需要监视的主机ip,端口为服务器上上文中添加的 -Dcom.sun.management.jmxremote.port="portNumber"设定的端口,本文以9004为例。在设定 为:-Dcom.sun.management.jmxremote.authenticate="false" 的情况下,用户名和口令留空即可。

进阶安全设定

在上文中的配置适用于在测试环境中监视tomcat,如果是在生产环境中监视tomcat则需要在安全性上有进一步要求。

配置jmx访问密码

1. 修改上文中的catalina脚本中的JAVA_OPT参数,将
-Dcom.sun.management.jmxremote.authenticate="false" 修改为:
-Dcom.sun.management.jmxremote.authenticate="true"


2. 将$JRE/lib/management/jmxremote.password.template文件在同目录下复制一份,重命名为$JRE/lib /management/jmxremote.password,编辑jmxremote.password,添加允许访问的用户名及密码,比如添加用户 zxwh,密码为zxme,则在文件尾添加一行:
zxwh zxme
注意用户密码不能包含空格,tab等字符


3. 编辑$JRE_HOME/lib/management/jmxremote.access文件,对刚才添加的用户赋予一定的权限:
zxwh readonly (或者readwrite)


4. 确认jmxremote.password和jmxremote.access两个文件中的用户是相同的。注意如果jmxremote.access中没有对应用户的话,配置是无效的。
注:以上配置文件的位置都是可以更改的,具体配置方法在此不再赘述。

5. 由于jmxremote.password中的密码都是明文保存的,所以jmxremote.password、jmxremote.access文件的权限要注意,应该设置为只有owner才可读,当然这个用户也必须是启动tomcat的用户。

6. 启动jconsole进行连接,在用户名和口令处输入设定的用户和密码。

7. 使用密码认证方式进行连接,不但可以提高安全性,而且可以对用户的权限进行设置。如果不使用密码认证的方式,则无法对用户的权限进行限制。

配置使用ssl进行加密连接

1. 在服务器上使用keytool创建密钥对
keytool是java平台自带的一个密钥和证书管理工具,使用keytool创建密钥对:
keytool -genkey -alias tomcat -keystore /somepath/tomcatKeyStore
按照提示输入相关信息(包括设定密码、姓、组织名等),这些信息是可以随便输入的,但从产品角度讲应该统一设定。输入的密码在今后操作中均需要使用。

2. 导出公钥
keytool -export -alias tomcat -keystore /somepath/tomcatKeyStore -file /somepath/jconsole.cert

3. 将公钥导入至需要运行jconsole的机器。
keytool –import –alias jconsole –keystore /somepath/jconsoleKeyStore -file /somepath/jconsole.cert

4. 修改tomcat的catalina脚本
将-Dcom.sun.management.jmxremote.ssl="false"修改为:
-Dcom.sun.management.jmxremote.ssl="true",并在 JAVA_OPTS变量行添加:
-Djavax.net.ssl.keyStore=/somepath/jconsoleKeyStore
-Djavax.net.ssl.keyStorePassword=设定的密码

6. 填入主机名、用户、口令连接服务器。

其他问题

1. 在执行shutdown.sh或者shutdown.bat脚本关闭tomcat时出现如下错误,tomcat无法关闭:
错误: 代理抛出异常: java.rmi.server.ExportException: Port already in use: 9004;
nested exception is:
java.net.BindException: Address already in use: JVM_Bind

出错原因:JAVA_OPT变量设置的参数未放置于本文档中指定位置。

(转)http://k-freedom.spaces.live.com/blog/cns!CF84914AA1F284FD!336.entry



Jconsole, 是用來監控 JVM 運行狀況的工具, 

本篇以 Client 端想監控 Resin Server 的目的, 分享如何監控遠端的 Server 其 JVM 使用狀況, 

以下為Client端設定方式: 

PS: shell 不代表一定是 win32 或是 Linux 懂意思就好…

shell>cd $JAVA_HOME/jre/lib/management/ 
shell>mv jmxremote.password.template jmxremote.password

編輯 jmxremote.password 這個檔案,把

#monitorRole QED 
#controlRole R&D

前面兩個#消掉

然後執行你電腦上面 jdk/bin 裡面的 jconsole.exe 
輸入要連線的 IP 以及 port 
username = monitorRole 
password = QED 
這帳號也是有權限的 
controlRole 是 rw 
monitorRole 是 readonly

Client 端設定結束。

Server 端 resin.conf 新增如下:

-Dcom.sun.management.jmxremote.port=7000 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 

如此重啟 Resin 後即可監控。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值