通过jmx访问jvm知道的Mbean的一些信息,可以取得系统运行时的一些情况,
比如说,内存(堆内存大小,非堆内存大小),还有各个区的内存大小。
还可以访问gc收集器的gc次数。来确定minorGC和fullGc的次数都可以获得。
一:获得堆内存和非堆内存的大小。
public String monitorMemory() {
StringBuilder sb = new StringBuilder("Memory:");
MemoryMXBean mmbean = ManagementFactory.getMemoryMXBean();
MemoryUsage hmu = mmbean.getHeapMemoryUsage();
sb.append("[HeapMemoryUsage:");
sb.append(" Used=" + formatBytes(hmu.getUsed()));
sb.append(" Committed=" + formatBytes(hmu.getCommitted()));
sb.append("]");
MemoryUsage nhmu = mmbean.getNonHeapMemoryUsage();
sb.append("[NonHeapMemoryUsage:");
sb.append(" Used=" + formatBytes(nhmu.getUsed()));
sb.append(" Committed=" + formatBytes(nhmu.getCommitted()));
sb.append("]");
return sb.toString();
}
在我的测试代码下,jdk1.6下 -server 的测试运行结果摘要为:
写道
Memory:[HeapMemoryUsage: Used=656K Committed=6016K][NonHeapMemoryUsage: Used=3414K Committed=6400K]
二:获得内存分区间的大小。
public String monitorMemoryPool() {
StringBuilder sb = new StringBuilder("MemoryPool:");
List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean p : pools) {
sb.append("[" + p.getName() + ":");
MemoryUsage u = p.getUsage();
sb.append(" Used=" + formatBytes(u.getUsed()));
sb.append(" Committed=" + formatBytes(u.getCommitted()));
sb.append("]");
}
return sb.toString();
}
这个的输出,跟平添相关性很大,并且跟启动的jvm参数也有关系,我这里是用-server的模式启动,-client的话读者可以试试,会多一些东西。
在我的测试输出为:
写道
MemoryPool:[Code Cache: Used=354K Committed=2304K][PS Eden Space: Used=410K Committed=768K][PS Survivor Space: Used=0K Committed=128K][PS Old Gen: Used=246K Committed=5120K][PS Perm Gen: Used=3060K Committed=4096K]
看的还是很清楚的。
三:gc收集器的gc次数。
public String monitorGC() {
StringBuilder sb = new StringBuilder("GC:");
List<GarbageCollectorMXBean> gcmbeans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean gc : gcmbeans) {
sb.append("[" + gc.getName() + ": ");
sb.append("Count=" + gc.getCollectionCount());
sb.append(" GCTime=" + formatMillis(gc.getCollectionTime()));
sb.append("]");
}
return sb.toString();
}
在我的机器测试输出为:
写道
GC:[PS Scavenge: Count=29 GCTime=0.0460sec][PS MarkSweep: Count=7 GCTime=0.1220sec]
这是运行过一段时间够的结果,minorGC和full gc对应的gc方式分别对应上面的2个名字。
因此可以看到,minorGC29次,FULL GC 7次。
关于这个可以进一步查看 RednaxelaFX 的 通过Java/JMX得到full GC次数?
四:结果。
既然能够在运行中动态得到这些数据,那就可以用来进行一些简单的系统监控,启动一个线程,每隔2分钟采一次样,然后进行分析记录。
通过剩余内存的大小,一段时间内FULL GC 的次数来进行相应的预警,还是比较简单,有效的。
我这使用的测试代码,每隔5秒钟打印一次信息。
public static void main(String[] args) {
System.out.println("beging monitor");
new Thread(new Runnable() {
public void run() {
JmxMonitorUtil monitor = new JmxMonitorUtil();
while (true) {
System.out.println("------------------------");
System.out.println(monitor.monitorMemory());
System.out.println(monitor.monitorMemoryPool());
System.out.println(monitor.monitorGC());
System.out.println("------------------------");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
分享到:
相关推荐
Java监控系统对于理解应用程序的运行状况...总的来说,理解和监控Java系统的链接和内存使用情况,是确保系统高效、稳定运行的重要一环。开发者应熟练掌握相关工具和技巧,持续关注系统的健康状况,及时进行优化和调整。
2. 内存管理:监控垃圾收集(Garbage Collection, GC)活动,包括GC执行频率和暂停时间,这些对于理解应用性能瓶颈至关重要。 监控Tomcat: Tomcat作为Java应用服务器,其监控重点在于: 1. 连接器状态:检查HTTP...
1. **监控GC**:通过JMX获取JVM的垃圾收集统计信息,如垃圾收集时间、内存分配情况等。 2. **线程诊断**:查看和分析JVM中的线程状态,查找死锁或资源争抢问题。 3. **内存诊断**:实时查看堆和非堆内存使用情况,...
WebLogic服务器内存调优是一个关键的过程,以确保应用程序的稳定性和高效性。内存配置不当可能导致系统性能下降,甚至出现内存溢出...在实践过程中,应监控内存使用情况,根据实际情况进行微调,以达到最佳的性能效果。
GC的频率反映了系统的内存使用情况和健康状况。通常,GC分为两种主要类型:Scavenge GC(年轻代GC)和Full GC。年轻代GC主要处理新生代的对象,而Full GC则涉及到整个堆,包括年轻代和老年代,它的执行通常会导致较...
- **VisualVM**:集成了JMX,可以监控CPU、内存、线程等,查看GC日志,分析内存泄漏。 - **JConsole**:JDK自带的监控工具,提供GUI界面,可监控JVM的各种指标。 - **JProfiler** 和 **YourKit Java Profiler**:...
VisualVM通过实时监控GC活动,展示了不同垃圾回收器的工作情况。它能够提供以下关键信息: 1. **内存分配**:Visual GC可以显示每个线程堆栈上的对象分配情况,帮助开发者找出内存泄露的潜在源头。 2. **堆内存状态...
1. **JVM监控**: JMX可以通过MBeans提供JVM的性能指标,如内存使用情况、线程状态、类加载统计等。 2. **Garbage Collection调优**: 使用JMX,可以监视垃圾收集器的运行情况,甚至动态调整GC参数。 3. **类加载...
首先,VisualGC能够展示堆内存的实时状态,包括新生代、老年代和持久代的大小、使用情况以及剩余空间。这对于识别内存泄漏或者理解对象生命周期是非常有用的。通过观察GC活动,我们可以发现可能的性能瓶颈,例如频繁...
5. **JMX支持**:通过JMX(Java Management Extensions)连接到远程应用,进行远程监控和管理。 6. **采样分析**:定期采样线程堆栈,展示程序的执行路径。 7. **本地及远程连接**:不仅可以分析本地运行的应用,还...
通过上述两个部分的学习,我们不仅了解了如何使用JMX工具进行Storm集群的监控,还学会了如何利用VisualVM进行更全面的性能监测。这些知识对于从事大数据分析架构设计的专业人士来说是非常宝贵的,能够帮助他们在日常...
- 内存泄漏检测:通过监控内存使用情况,查找可能导致内存泄漏的对象和代码。 3. **性能指标** - CPU使用率:过高可能表明存在CPU密集型计算或线程阻塞问题。 - 内存使用:关注堆内存和非堆内存的使用,过高可能...
你可以通过它观察GC的执行情况,查看堆内存的使用状况,定位内存泄漏等问题。 2. **JConsole**:这是JDK自带的另一个监控工具,提供GUI界面,可以实时监控JVM的内存、线程、类加载、MBean等信息。与VisualVM类似,...
在GC监控方面,除了使用JMX参数外,还可以使用-Xloggc:文件参数来记录GC日志,并通过-XX:+PrintGCDetails等参数打印GC的详细信息。 优化建议包括合理设置堆内存大小,选择合适的垃圾回收器,调整新生代与老年代的...
在IT运维领域,监控系统的重要性不言而喻,特别是对于基于Java的应用服务器,如Tomcat,实时监控其运行状态能够确保服务的稳定性和性能。Zabbix是一款广泛应用的开源监控工具,能够对各种IT资源进行精细化监控。本篇...
例如,通过监控内存使用情况,可以及时发现长期存活的对象,从而调整GC策略。 在资源有限的情况下,我们需要确定JVM能支持的负载水平,这涉及到内存分配策略和线程并发数的设置。同时,为了支撑目标负载,需要预测...
Java提供JMX(Java Management Extensions)和JConsole等工具来监控内存分配、对象存活状态和垃圾收集情况。 **系统内存释放原理** 操作系统如Windows采用虚拟内存机制,通过页面文件在物理内存不足时使用硬盘空间...