`

Jconsole简介

阅读更多

Jconsole简介:

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

开始jconsole

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

命令语法:

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

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

本地监视:

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

Jconsole [processed]

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

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

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

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

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

jconsole 2956

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

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

详细信息见:Local JMX Monitoring and Management.

远程监视:

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

jconsole [hostname:portNum]

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

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

连接JMX代理:

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

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

Local

Remote

Advanced

Local选项卡

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

Remote选项卡

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

Host name:远程主机名

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

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

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

Enabling the JMX Management Agent.

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

Using Password and Access Files.

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

Advanced选项卡

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

javax.management.remote.JMXServiceURL.

注意:如果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和操作系统的信息。

Summary

UptimeJVM已运行时长。

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

Process CPU timeJVM花费的总CPU时间。

Threads

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

PeakJVM启动后,活动线程峰值。

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

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

Memory

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

Committed memory为堆分配的内存总量

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

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

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

Classes

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

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

Total classes unloadedJVM启动后,从内存卸载的classes总量。

Operating System

Total physical memory物理内存总量

Free physical memory物理内存空闲量

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

监视内存消耗:

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

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

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

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

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

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

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

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

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

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

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

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

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

Heap and Non-heap内存

JVM管理两种内存:heapnon-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 GCVM将剩余的对象从eden space移动到某个survivor space中。然后VM将那些在survivor spaces中生存了足够长时间的对象移动到位于old generation中的tenured spaces。当tenured spaces满了以后,将发生一次full GCfull GC涉及到所有存活的对象,因此比较慢。

Permanent generation保存了所有的虚拟机自身的反射数据,比如classmethod objects

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

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

Tuning Garbage collection with the 5.0 HotSpot VM

监视线程使用:

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

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

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

Magenta:线程总数

Red:峰值线程数

Blue:活动线程数。

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

监视Class加载:

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

图表显示了 类加载/时间

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

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

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

监视和管理MBeans

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

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

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

显示图表:

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

查看VM信息。

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

这些信息包括:

UptimeJVM启动后的总时间。

Processes CPU TimeJVM启动后消耗的总CPU时间。

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

配置tomcat使用jconsole

修改catalina脚本

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

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,在dorundostart段开头增加一行(注意是一行):

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,会出现如下界面:

直接进行连接即可。

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

主机名或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.passwordjmxremote.access两个文件中的用户是相同的。注意如果jmxremote.access中没有对应用户的话,配置是无效的。
注:以上配置文件的位置都是可以更改的,具体配置方法在此不再赘述。

5. 由于jmxremote.password中的密码都是明文保存的,所以jmxremote.passwordjmxremote.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. 修改tomcatcatalina脚本
-Dcom.sun.management.jmxremote.ssl="false"修改为:
-Dcom.sun.management.jmxremote.ssl="true"
,并在 JAVA_OPTS变量行添加:
-Djavax.net.ssl.keyStore=/somepath/jconsoleKeyStore
-Djavax.net.ssl.keyStorePassword=
设定的密码

5.使用如下参数启动jconsole
jconsole -J-Djavax.net.ssl.trustStore=/somepath/jconsoleKeyStore

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://blog.sina.com.cn/s/blog_4d6be6f30100siht.html

分享到:
评论

相关推荐

    jconsole-1.8.0.zip

    一、JConsole简介 JConsole是Java平台的标准组件,主要功能是监控Java虚拟机(JVM)的状态,它通过JMX(Java Management Extensions)接口来获取信息。JConsole可以提供实时的性能数据,帮助开发者和运维人员诊断和...

    JConsole(观察分析Java程序的运行)

    #### 一、JConsole简介 JConsole是自Java 5开始集成在JDK中的一个强大的性能监视和故障排除工具。它能够帮助开发者和运维人员监控Java应用程序的运行状态,并进行性能分析。JConsole支持图形用户界面(GUI)模式和...

    jconsole使用

    **一、jconsole简介** `jconsole`是Java Management Extensions (JMX) 的一部分,通过JMX接口来监控和管理Java应用。它支持本地和远程连接,可以连接到运行在相同机器或网络上的其他Java进程。`jconsole`提供了一个...

    java jvm Jconsole

    #### 一、JConsole简介与基本使用 JConsole是一个由Oracle提供的免费工具,作为Java Development Kit (JDK)的一部分被包含其中。它是一个基于Java Management Extensions (JMX)的图形用户界面(GUI)工具,主要用于...

    jconsole-tomcat配置

    #### 二、jconsole简介 jconsole是一款由Oracle公司提供的图形化Java监视工具,它能够帮助开发者或运维人员远程监控Java应用程序的状态,包括但不限于内存使用情况、线程状态、垃圾回收情况等。通过jconsole,可以...

    使用Jconsole对java的内存使用情况(JVM)进行监控参照.pdf

    一、Jconsole简介 Jconsole是JDK1.5中提供的JMX remote的管理工具,可以监控Java运行程序的各种信息,包括内存使用情况、活动线程数量、类装载的数量、MBeans的状态、虚拟机的各种信息等。使用Jconsole可以实时监控...

    自己实践jconsole远程配置方法傻瓜型文档

    jconsole简介** `jconsole`是Java Development Kit (JDK) 自带的一个图形界面工具,用于监视和调试正在运行的Java应用程序。它能够显示应用程序中的各种数据,包括内存使用情况、线程状态、类加载信息等,并且支持...

    公司内部培训jconsole

    【Jconsole 简介】 Jconsole 是 Sun Microsystems(现为 Oracle 公司)在 JDK 1.5 版本中引入的一个强大的监控工具,它位于 JAVA_HOME 的 bin 目录下,是一款基于 Swing 图形用户界面的应用程序。Jconsole 主要用于...

    基于Idea+Jconsole实现线程监控步骤

    一、JConsole简介 JConsole是一个内置Java性能分析器,可以从命令行或在GUI shell中运行。它可以轻松地监控Java应用程序性能和跟踪Java中的代码。从Java 5开始,JConsole就已经引入,成为Java开发中一个非常重要的...

    JAVA及数据库基础学习

    - **Jconsole简介.doc**:Jconsole是Java的监控和管理工具,用于分析JVM的性能和内存使用情况。 - **HTML标记.doc**:HTML是网页的基本结构语言,对于开发Web应用的Java程序员来说,基础HTML知识是必备的。 - **...

    Jconsole JDK自带的监控程序

    #### 一、简介 JConsole是一款由Sun Microsystems(现已被Oracle收购)开发并集成于JDK 1.5及以上版本中的图形化监控工具。它能够帮助开发者及运维人员监测和诊断运行中的Java应用程序的性能问题。与市面上的商业...

    <jconsole-1> 用法简介

    NULL 博文链接:https://zoroeye.iteye.com/blog/2038627

    Java自带的性能监控工具使用简介

    Java 自带的性能监控工具使用简介 Java 自带的性能监控...Java 自带的性能监控工具使用简介,包括 VisualVM 和 JConsole,这些工具可以帮助开发者快速监控和优化 Java 应用程序的性能,提高应用程序的性能和可靠性。

    java命令详解 高手进阶

    **简介**:`jconsole.exe`是一个基于JMX的监视工具,可以远程监控和管理Java应用程序。 **用法**: - **基本用法**:启动jconsole并连接到本地或远程的Java应用程序。 - **参数详解**: - `-J&lt;options&gt;`:传递给...

    解决OutOfMemoryError: PermGen space

    #### 一、PermGen space简介 PermGen space是Java虚拟机(JVM)内存模型的一部分,用于存放加载的类信息、字符串常量池、静态变量以及其他与类有关的数据。与堆内存不同,PermGen space的大小默认相对较小,因此...

    applet内存泄漏问题.rar

    这可能包括使用各种工具进行内存分析,如Java自带的VisualVM或JConsole("jconsole说明.doc")。这些工具可以帮助开发者监视JVM的内存使用情况,查找长期存在的对象引用,从而定位内存泄漏的源头。 "Applet设计.ppt...

    解析JDK14中的java tools简介

    而`jconsole`和`jdb`则是管理和调试Java应用程序的重要工具,通过JMX协议,`jconsole`可以监控应用程序的性能,`jdb`则提供了命令行调试功能,对于远程调试和自动化测试场景十分实用。 总之,JDK 14中的Java工具...

Global site tag (gtag.js) - Google Analytics