- 浏览: 56220 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
wolfku:
写的很棒,受益匪浅
Jconsole与Jmx 分析JVM状况(上) -
Brucegaochina:
受教了!
Jconsole与Jmx 分析JVM状况(上) -
rain2005:
那你把SpoolAndExpiryThread重写一下不就可以 ...
二级缓存(ehcache)在weblogic导致线程增长问题
JVM 平台提供 Mbeans 说明
在 Java 2 平台 5.0 以上版本,有一组 API 可以让 Java 应用程序和允许的工具监视和管理 Java 虚拟机( JVM )和虚拟机所在的本机操作系统。该组 API 在 java.lang.management 。可以通过这些 API 可以监控 local 端 JVM ,同时也可以监控远端 JVM
Java 平台提供了如下一些接口用于管理 JVM 平台
ClassLoadingMXBean Java 虚拟机的类加载系统。
CompilationMXBean Java 虚拟机的编译系统。
MemoryMXBean Java 虚拟机的内存系统。
ThreadMXBean Java 虚拟机的线程系统。
RuntimeMXBean Java 虚拟机的运行时系统。
OperatingSystemMXBean Java 虚拟机在其上运行的操作系统。
GarbageCollectorMXBean Java 虚拟机中的垃圾回收器。
MemoryManagerMXBean Java 虚拟机中的内存管理器。
MemoryPoolMXBean Java 虚拟机中的内存池。
这些 Bean 我们从 ManagementFactory 类中定义。
访问 Mean 的方式有两种
-
直接访问 MXBean 接口
-
通过静态工厂方法获取 MXBean 实例,从本地访问正在运行的虚拟机的 MXBean 接口。
-
构造 MXBean 代理实例,通过调用 ManagementFactory.newPlatformMXBeanProxy 将方法调用转发到给定的 MBeanServe r 。代理通常构造为远程访问另一个正在运行的虚拟机的 MXBean 。
-
通过 MBeanServer 接口间接访问(暂时还没来的及研究)
例:
直接调用同一 Java 虚拟机内的 MXBean 中的方法。
import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.lang.management.ThreadMXBean; public class JmxLocal { public static void main(String[] args) { OperatingSystemMXBean osbean = ManagementFactory .getOperatingSystemMXBean(); System.out.println(osbean.getArch());//操作系统体系结构 System.out.println(osbean.getName());//操作系统名字 System.out.println(osbean.getAvailableProcessors());//处理器数目 System.out.println(osbean.getVersion());//操作系统版本 ThreadMXBean threadBean=ManagementFactory.getThreadMXBean(); System.out.println(threadBean.getThreadCount());//总线程数 } }
使用 MXBean 代理。访问远程 Mbean
import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; import javax.management.MBeanServerConnection; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class JmxRemote { public static void main(String[] args) { try { // connect to a separate VM's MBeanServer, using the JMX RMI functionality JMXServiceURL address = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi"); JMXConnector connector = JMXConnectorFactory.connect(address); MBeanServerConnection mbs = connector.getMBeanServerConnection(); ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy (mbs, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); System.out.println(threadBean.getThreadCount());//线程数量 } catch(Exception e){ e.printStackTrace(); } } }
如果要远程访问,被访问 Mbean 服务器首选需要 命令行选项启动远程虚拟机,这些选项设置虚拟机的相关 JMX 代理侦听请求的端口,以及起作用的安全级别
如下:
-Dcom.sun.management.jmxremote.port=9999 -- 指定端口
-Dcom.sun.management.jmxremote.authenticate=false – 指定是否需要密码验证
-Dcom.sun.management.jmxremote.ssl=false – 指定是否使用 SSL 通讯
例:我要测试下面运用程序
public class Test { public static void main(String[] args) { Thread thread=new Thread(); thread.run(); try { thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Success"); } }
启动上面运用程序时在 VM arguments 加上如上配置
远程监控 Jboss 或者 weblogic 需要配置如下:
Jboss 设置:
-
找到 run.bat 文件( linux 环境下是 run.sh )文件,有一行
set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name=%PROGNAME%
改成
set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name=%PROGNAME%
-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Weblogic 设置:
-
找到你要监控 domain 下的 startWebLogic.cmd 文件( linux 环境下是 startWebLogic.sh )文件、将文件中
set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS%
改成
set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS%
-Dcom.sun.management.jmxremote.port=9998 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Jconsole 使用说明:
启动 jconsole
jconsole 是 JVM 自带管理 Mbean 的图形化界面
环境变量中 path 中加上
C:\Program Files\Java\jdk1.6.0_01\bin
在控制台中敲 jconsole
一个用于连接的对话框将会打开。对话框的本地进程列出本地 JVM ,中进程的 ID
你会看到两种方式,一种是本地进程,另外一种连接方式远程进程
当JConsole 成功建立连接,它从连接上的JMX 代理处获取信息,并且以下面几个标签页呈现信息。
概述 tab. 监控 JVM 主要图形
内存 tab. 内存使用信息
线程 tab. 线程使用信息
类 tab. 类调用信息
VM 摘要 tab. JVM 的信息
MBeans tab. 所有 MBeans 的信息
如下图:
MBeans tab 展示了所有以一般形式注册到 JVM 上的 MBeans 。 MBeans tab 允许你获取所有的平台信息,包括那些不能从其他标签页获取到的信息。注意,其他标签页上的一些信息也在 MBeans 这里显示。另外,你可以使用 MBeans 标签管理你自己的应用的 MBeans 。当然你也可以添加其它工具提供的 MBeans 例如 Jboss , weblogic 连接池信息
内存管理:
管理内存有如下几个Mbeans :
MemoryMXBean Java 虚拟机内存系统
MemoryManagerMXBean Java 虚拟机中的内存管理器。
MemoryPoolMXBean Java 虚拟机中的内存池。
MemoryPoolMXBean
说明:
注册到
JMX
代理的平台或者应用的
MBeans
,可以通过
MBeans
标签获取。例如
,
MemoryMXBean
如下面定义
public interface MemoryMXBean { public MemoryUsage getHeapMemoryUsage(); public MemoryUsage getNonHeapMemoryUsage(); public int getObjectPendingFinalizationCount(); public boolean isVerbose(); public void setVerbose(boolean value); public void gc(); }
MemoryMXBean 包括四个属性:
-
HeapMemoryUsage. 用于描述当前堆内存使用情况的只读属性
-
NonHeapMemoryUsage. 用于描述当前的非堆内存的使用情况的只读属性
-
ObjectPendingFinalizationCount. 用于描述有多少对象被挂起以便回收。
-
Verbose. 用于动态设置 GC 是否跟着详细的堆栈信息,为一个布尔变量
内存的 MBean 支持一个操作—— GC ,此操作可以发送进行实时的垃圾回收请求。
(
Heap—NonHeap 内存说明:
程序运行时存储数据主要有:寄存器,堆栈,堆,常量存储,非 RAM 存储
速度由高到低。
-
堆内存类型( Heap ): Java 虚拟机具有一个 堆 ,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。
-
非堆内存类型( Non-Heap ): Java 虚拟机管理堆之外的内存(称为 非堆内存 )。非堆内存包括 方法区 和 Java 虚拟机的内部处理或优化所需的内存。它存储每个类结构,如运行时常数池、字段和方法数据,以及方法和构造方法的代码。
)
监控内存(
MemoryPoolMXBean
)
内存标签页通过读取内存系统、内存池、垃圾回收的
MBean
来获取对内存消耗、内存池、垃圾回收的情况的统计。
主要统计随时间变化,对堆的、非堆的以及特殊内存池的统计 如下图
右下角分别绿色竖条分别表示如下(前面三项堆内内存,后面三项非堆内内存)
Eden
Space (heap)
:
内存最初从这个线程池分配给大部分对象。
Survivor
Space (heap)
:
用于保存在
eden
space
内存池中经过垃圾回收后没有被回收的对象。
Tenured
Generation (heap)
:
用于保持已经在
survivor
space
内存池中存在了一段时间的对象。
Permanent
Generation (non-heap):
保存虚拟机自己的静态
(refective)
数据,例如类(
class
)和方法(
method
)对象。
Java
虚拟机共享这些类数据。这个区域被分割为只读的和只写的,
Code
Cache (non-heap):
HotSpot
Java
虚拟机包括一个用于编译和保存本地代码(
native
code
)的内存,叫做“代码缓存区”(
code
cache
)
详细信息区域
已经使用 : 已使用:当前的内存使用量。使用的内存包括所有对象占用内存
分配 : Java 虚拟机保证能够获取到的内存量。分配内存的量可能随时间改变。 Java 虚拟机可能释放部分这里的内存给系统,相应的分配的内存这时可能少于初始化时分配的给它的量。分配量总数大于或等于已使用的内存量。
最大值 : 内存管理系统可以使用的最大内存量。这个值可以被改变或者不做设定。如果 JVM 试图增加使用的内存到大于分配量,内存分配可能失败这就是我们在起 web 服务时常出现内存不够状况
分配和最大值我们都可以在运用服务启动时指定
例如:启动时设定:
-Xms512m -Xmx1024m
-Xms512m 为分配量, 1024m 为最大分配量
垃圾回收( GarbageCollectorMXBean )
提供两个接口
long getCollectionCount ()
long
getCollectionTime
()
GC
时间
:
垃圾回收使用的总时间和调用垃圾回收的次数。
通过
getCollectionTime ()/ getCollectionCount ()
内存池( MemoryPoolMXBean )
提供内存管理接口, API 详细介绍请看 http://gceclub.sun.com.cn/Java_Docs/jdk6/html/zh_CN/api/java/lang/management/MemoryPoolMXBean.html#setCollectionUsageThreshold%28long%29
Usage Threshold ( 使用量阈值 )
usage threshold 是内存池中一个可管理的属性。默认值由 JVM 设置。可以通过 setUsageThreshold 方法设置使用量阈值。如果阈值设置为正数,将启用此内存池中的使用量阈值超过检查。如果使用率阈值设置为零,将禁用此内存池的使用量阈值超过检查。 isUsageThresholdSupported() 方法可用于确定是否支持此功能。
Java 虚拟机在其最恰当的时候(通常在垃圾回收时)会对内存池逐个进行使用量阈值超过检查。每个内存池均维护一个使用量阈值计数,每次 Java 虚拟机检测到内存池使用量超过阈值,此值都会加 1 。 getUsageThresholdCount() 可以取得超过使用量阈值的次数
Collection Usage Threshold ( 回收使用量阈值 )
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
Collection usage threshold 是可进行垃圾回收的内存池的一个可配置属性。 JVM 堆一个内存池进行 垃圾回收以后,此内存池中的一些内存仍然被那些没有被回收的对象占用。 collection usage threshold 仅允许你在垃圾回收后对内存进行检查。如果 JVM 发现可用内存超出 collection usage threshold ,它将会设置 CollectionUsageThresholdExceeded 属性为 true 。你可以使用 CollectionUsageThresholdSupported 属性来控制内存池释放支持 collection usage threshold.
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
usage threshold 和 collection usage threshold 在 Jconsole 中 MBean 设置
如果超过设定值,内存 Tab 会出现如下:
发表评论
-
Java多线程编程入门教程
2010-01-13 13:37 1144Java多线程编程入门教程 -
ubuntu 环境变量设置
2009-12-23 00:23 0sudo gedit .bashrc e ... -
Thread dump Jvm诊断
2009-12-04 13:38 0Thread dump Jvm诊断 查找运行在JVM上的pr ... -
Jconsole与Jmx 分析JVM状况(下)
2009-12-03 00:15 5609线程(ThreadMXBean ) 从 ... -
Java正则表达式
2009-11-11 00:51 2152正则表达式 实质上是一个模式,用于描述共享该模式的一组字符串 ...
相关推荐
Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、服务和设备。JMX允许开发者创建和管理MBeans(Managed Beans),这些MBeans代表了可管理的资源,比如系统特性、服务状态...
在这个主题中,我们将深入探讨JVM与JMX在Java环境中的交互以及它们如何增强Java应用的管理和维护能力。 **JVM详解** JVM是Java语言的核心组成部分,它实现了Java的跨平台特性。JVM的主要职责包括加载类、验证字节码...
使用JMX连接JVM实现过程详解 摘要:本文主要介绍了使用JMX连接JVM实现过程详解,通过示例代码对JMX的概念、安装、配置和使用进行了详细的介绍,为读者提供了一份详细的参考指南。 一、什么是JMX? JMX(Java ...
JConsole通过JMX接口与目标JVM进行通信,获取并展示数据。 JMX是一种标准的API,它允许开发人员在Java应用中定义、管理和操作管理资源,如系统、组件或服务。JMX的核心概念包括MBean(Managed Beans)、MBeanServer...
JConsole通过JMX接口与运行的JVM通信,收集关于内存、线程、类装载、垃圾回收、CPU使用率等信息。在源码中,你可以看到如何使用MBean(Managed Beans)和MBeanServer来注册和操作管理对象。 2. **GUI设计**:...
JConsole通过JMX(Java Management Extensions)技术来实现远程管理和监控,允许开发者和运维人员实时查看JVM的内存使用、线程状态、类加载、MBeans以及虚拟机详细信息。 1. **概述**: - **堆内存**:显示JVM堆...
### JConsole:观察与分析Java程序的运行 #### 一、JConsole简介 JConsole是自Java 5开始集成在JDK中的一个强大的性能监视和故障排除工具。它能够帮助开发者和运维人员监控Java应用程序的运行状态,并进行性能分析...
使用Jconsole对Java的内存使用情况(JVM)进行监控参照 JDK1.5提供了JMX remote的管理工具Jconsole,可以监控Java运行程序的内存使用情况、活动线程数量、类装载的数量、MBeans的状态、虚拟机的各种信息等,还可以...
#### 一、JConsole简介与基本使用 JConsole是一个由Oracle提供的免费工具,作为Java Development Kit (JDK)的一部分被包含其中。它是一个基于Java Management Extensions (JMX)的图形用户界面(GUI)工具,主要用于...
《使用Jconsole对Java内存使用情况(JVM)进行监控》 Jconsole是Java开发工具包(JDK)1.5版本及更高版本提供的一款基于Java Management Extensions (JMX)的图形化管理工具,用于实时监控Java应用程序的性能和资源...
Java提供了一款强大的可视化监控工具——jconsole.jar,它可以帮助开发者和系统管理员实时查看和分析JVM(Java Virtual Machine)的状态,包括内存使用、线程状态、类加载情况以及垃圾收集等关键指标。本文将详细...
"jconsole连接说明.txt"文件应该包含了如何使用JConsole进行连接的详细步骤和注意事项,确保按照说明正确配置JMX,以实现JConsole与JVM的有效通信。 总的来说,JConsole是Java开发和运维中不可或缺的工具,它可以...
3. **远程JVM监控**:与jconsole类似,需要在远程JVM上启动特定的服务,并在jvisualvm中输入服务地址进行连接。 ##### Oracle JRockit Mission Control (JRMc) JRMc是专为Oracle JRockit JVM设计的一款高级监控工具...
本地连接直接与当前机器上的JVM连接,远程连接则需要配置JVM的远程访问选项,如设置`com.sun.management.jmxremote.port`、`com.sun.management.jmxremote.authenticate`等相关属性。 2. **监控指标**:在不同视图...
JConsole是Java平台的标准组件,主要功能是监控Java虚拟机(JVM)的状态,它通过JMX(Java Management Extensions)接口来获取信息。JConsole可以提供实时的性能数据,帮助开发者和运维人员诊断和解决应用程序可能...
标题中的“使用Jconsole对java的内存使用情况(JVM)进行监控”指的是通过Jconsole工具来监测Java应用程序的内存消耗和其他关键性能指标。Jconsole是一款由JDK 1.5及更高版本提供的基于JMX(Java Management ...
而连接器则是客户端与MBeanServer交互的通道,比如JConsole和VisualVM这样的工具,它们通过JMX连接器与JVM建立连接,以可视化方式展示和操作JVM的状态。 4. **JMX客户端工具**: 如Spring Boot Actuator、JConsole和...
通过图形化界面,`jconsole`能够帮助我们实时查看和分析Java虚拟机(JVM)的状态,包括内存、线程、类加载、垃圾收集以及各种MBean(Managed Beans)等信息。本篇将深入探讨`jconsole`的使用方法和相关知识点。 **...