`
afunti
  • 浏览: 103749 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

Jconsole 管理jvm中的heap

阅读更多

转载自:http://tw.myblog.yahoo.com/eoda227/article?mid=544&prev=551&next=499

使用jconsole 来监视Java 程式使用资源最近的专案都需要使用Java来开发程式,在Java程式开发中需要一些java程式debug与性能调整方面的工作,jconsole是jdk内建的工具比较好用。

Jconsole简介: Jconsole是一个JMX相容的监视工具。 它使用Java虚拟机器的JMX机制来提供运行在Java平台的应用程式的性能与资源耗费资讯。

开始jconsole(我是使用jdk6) 
Jconsole应用程式位于JDK_HOME/bin目录下。

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

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

 监视本地应用程式 (我用Eclipse来当被监测对象) 
1. 开启eclipse 

2. 开启jconsole,选”Local Process” 中刚才开启的eclipse,按“Connect” 来监看 
Jconsole介面: Jconsole介面由以下六个选页签组成:

  • Overview页签:显示JVM和被监视值的汇总资讯。
  • Memory页签:显示记忆体使用资讯。
  • Threads页签:显示执行绪使用资讯。
  • Classes页签:显示类(class)载入资讯。
  • VMSummary页签:显示JVM资讯。 
  • MBeans页签:显示MBeans资讯。

以下是详细介绍:
 (1) Overview页签

  • 有Heap记忆区使用情况
  •  Threads个数
  • Class载入个数
  • CPU使用百分比

(2) Memory 页签 
以上图表显示了JVM的记忆体使用和时间的对应关系,主要包括: (a) heap和(b) non-heap

PS. 
Heap and Non-heap记忆体:JVM管理两种记忆体:heap 和non-heap 记忆体,两种记忆体都是在JVM启动时建立。

Heap memory 是运行时资料区域,用于JVM为所有物件实例和伫列分配的记忆体。 Heap可能为固定值或者可变值。 垃圾收集器是一个用于回收物件占用的heap记忆体的自动化记忆体管理系统。  
Non-heap memory 包含一个在所有执行序共用的方法区域(method area)和内部进程或JVM优化所需的记忆体。它存储了每一个类的结构,比如运行常量池,栏位和方法资料,构造函数和方法的代码。 方法区域逻辑上是heap的一部分,但是依赖于实现,JVM可能不进行垃圾收集或压缩。 像heap一样,方法区域可能为固定或可变大小。 方法区域所需要的记忆体没有必要是连续的。

Heap Memory Pool 
A. Eden Space(heap):大多数物件初始化时从Eden Space池分配记忆体,即是存在于此池中 
B. Survivor Space(heap):此池包含的物件是那些原先在eden space中,但是已经经历过垃圾回收而仍然存在的物件。 
C. Tenured Generation(heap):在surviver space中已经存在了一段时间之后的物件会移动到这个池中。

Non-Heap Memory Pool 
D. Code Cache (non-heap):储存编译的程式码和local variables。 
E. Permanent Generation(non-heap):包含虚拟机器自身的所有反射资料。 比如classmothod物件。 对于使用class data sharing的JVM,分为唯读(shared-ro)读写(shared-rw)两个区域。

Details区域显示了几种当前记忆体度量: 
Time:目前的时间。
Used:目前使用的记忆体总量。  
Committed:JVM可使用的记忆体量。 Committed记忆体数量可能随时间变化而变化。 JAVA虚拟机器可能将某些记忆体释放,还给作业系统,committed记忆体可能比启动时初始分配的记忆体量要少。 Committed记忆体总是大于等于used记忆体。  
Max:记忆体管理可用的最大记忆体数量。 此值可能改变或者为未定义。 如果JVM试图增加使用记忆体(used memory)超出了committed记忆体,那么即时使用记忆体小于或者等于最大记忆体(比如系统虚拟记忆体较低),记忆体分配仍可能失败。  
GC Time:Garbage collection的时间。

Permanent Generation的排列如下图: 

(3) Threads页签 

(4) Classes页签 

(5) VMSummary页签 

(6) MBeans页签 

3. 开启Eclipse中的Tomcat (1) 在index.jsp 上点选右键
 

(2) 选Run on Server 执行 

(3) 执行后结果

4. 切换到jconsole视窗,观看结果 

(1) Overview图有明显变化 

(2) Heap memory Usage 

(2) Non-Heap memory Usage 


监视远端应用程式 (以Tomcat为测试对象)
1. 配置tomcat使用jconsole 
修改catalina脚本 
Windows平台:修改catalina.bat,在”dostart:” 后增加一行(注意是一行):

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port="9005" -Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote .ssl="false"

Unix/Linux平台:修改catalina.sh,在”dostart:” 后增加一行(注意是一行):

JAVA_OPTS="$JAVA_OPTS "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port="9005" -Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote .ssl="false"

2. 启动Tomcate (startup.bat或启动service)

3. 到远端的电脑,启动jconsole

4. 可同样观察远端Tomcat执行情况 
注:如果想设定远端的管理帐号密码,可以参考
http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html 的设定

通常在发生“
Memory Error”如Exception in thread “main” java.lang.OutOfMemoryError: Java heap space

Exception unloading sessions to persistent storage java.lang.OutOfMemoryError: PermGen space 
请调整JVM的参数设定,-XX:PermSize=256M -XX:MaxPermSize=256M等参数(依个人电脑上的资源与可能用到的记忆过大小再去设定,观察Memory页签,大概多留20%就够了)

属性详细请参考:http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

参考来源:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics