- 浏览: 276991 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
highphd:
海量用户如何处理啊?缓存服务器?大数据?
面向海量服务的设计原则和策略总结 -
AKka:
看了这篇博文更感觉到自己要学的东西更多了。同时感谢博主的辛勤写 ...
[Java性能剖析]JVM Management API -
sswh:
非常不错,感谢分享!!
[Java性能剖析]Sun JVM Attach API -
muyexi:
请问在Android开发中的什么场景下,会用到ObjectWe ...
[字节码系列]ObjectWeb ASM构建Method Monitor -
zoutuo:
前辈可否告知其中的“吞吐量”指的是什么?谢谢!
[Java性能剖析]Sun JVM内存管理和垃圾回收
JVM本身提供了一组管理的API,通过该API,我们可以获取得到JVM内部主要运行信息,包括内存各代的数据、JVM当前所有线程及其栈相关信息等等。各种JDK自带的剖析工具,包括jps、jstack、jinfo、jstat、jmap、jconsole等,都是基于此API开发的。本篇对这部分内容进行一个详细的说明。
参考:http://java.sun.com/javase/6/docs/api/java/lang/management/package-summary.html
一、Management API
我们先看一下从Sun JVM我们可以获取到哪些信息,如下图(来自于JConsole的MBean部分的截图):
1.HotSpotDiagnostic:非标准的监控JMX,这块是Sun JVM自带的,主要提供了两个功能
- 修改JVM的启动参数(譬如在不需要重启的情况下设置-XX:+HeapDumpOnOutOfMemoryError参数使得JVM内存不足的时候自动dump出堆空间到文件提供后续分析)
- Dump堆信息到文件,可以猜测jmap工具是基于此功能来完成的
我们通过com.sun.management.HotSpotDiagnosticMXBean定义了解其主要功能
public interface HotSpotDiagnosticMXBean { void dumpHeap(String s, boolean flag) throws IOException; List getDiagnosticOptions(); VMOption getVMOption(String s); void setVMOption(String s, String s1); }
2.ClassLoading:加载的类的总体信息,我们可以通过此MBean获取到JVM加载的类定义的总体信息,可以猜测JConsole的类功能就是通过此MBean来提供的。我们可以通过java.lang.management.ClassLoadingMXBean定义了解其提供的主要功能
public interface ClassLoadingMXBean { public long getTotalLoadedClassCount(); public int getLoadedClassCount(); public long getUnloadedClassCount(); public boolean isVerbose(); public void setVerbose(boolean value); }
3.Compilation:提供JVM的JIT(Just In Time)编译器(将bytecode编译成native code)的信息,我们可以通过java.lang.management.CompilationMXBean定义了解其提供的主要功能
public interface CompilationMXBean { public java.lang.String getName(); public boolean isCompilationTimeMonitoringSupported(); public long getTotalCompilationTime(); }
4.GarbageCollector:垃圾回收器信息,譬如在如上图中,我们启动的JVM会包含一个Copy垃圾回收器(用于Young Gen垃圾回收)和一个MarkAndSweep垃圾回收器(用于Tenured Gen垃圾回收)。我们可以通过java.lang.management.GarbageCollectorMXBean定义了解其提供的主要功能
public interface GarbageCollectorMXBean extends MemoryManagerMXBean { public long getCollectionCount(); public long getCollectionTime(); }
java.lang.management.MemoryManagerMXBean定义是
public interface MemoryManagerMXBean { public String getName(); public boolean isValid(); public String[] getMemoryPoolNames(); }
除了如上信息,Sun JVM在实现上还提供了一个额外的信息LastGCInfo,见com.sun.management.GarbageCollectorMXBean定义
public interface GarbageCollectorMXBean extends java.lang.management.GarbageCollectorMXBean { GcInfo getLastGcInfo(); }
我们可以通过下面的截图了解GcInfo包含的主要信息
其中java.lang.management.MemoryUsage后续可以看说明
5.内存相关
可以猜测,JConsole的内存部分的功能都是通过此部分的相关Bean来完成的。
1)Memory/MemoryManager:内存块相关信息,通过这MBean我们可以获取到内存的总体信息,并可以通过提供的gc操作进行强制gc的功能(System.gc())。我们可以通过java.lang.management.MemoryMXBean和java.lang.management.MemoryManagerMXBean了解其主要提供的功能
public interface MemoryMXBean { public int getObjectPendingFinalizationCount(); public MemoryUsage getHeapMemoryUsage(); public MemoryUsage getNonHeapMemoryUsage(); public boolean isVerbose(); public void setVerbose(boolean value); public void gc(); }
其中java.lang.management.MemoryUsage我们可以通过下图来了解其提供的主要信息
public interface MemoryManagerMXBean { public String getName(); public boolean isValid(); public String[] getMemoryPoolNames(); }
2)MemoryPool:通过该MBean可以了解JVM各内存块的信息,譬如对于Sun JVM,目前包括Eden Space、Suvivor Space、Tenured Gen、CodeCache、Perm Gen,可以猜测JConsole的内存监控功能就是通过此MBean来做到的。我们可以通过java.lang.management.MemoryPoolMXBean了解其主要提供的功能
public interface MemoryPoolMXBean { public String getName(); public MemoryType getType(); public MemoryUsage getUsage(); public MemoryUsage getPeakUsage(); public void resetPeakUsage(); public boolean isValid(); public String[] getMemoryManagerNames(); public long getUsageThreshold(); public void setUsageThreshold(long threshold); public boolean isUsageThresholdExceeded(); public long getUsageThresholdCount(); public boolean isUsageThresholdSupported(); public long getCollectionUsageThreshold(); public void setCollectionUsageThreshold(long threhsold); public boolean isCollectionUsageThresholdExceeded(); public long getCollectionUsageThresholdCount(); public MemoryUsage getCollectionUsage(); public boolean isCollectionUsageThresholdSupported(); }
6.系统运行信息
1)OperatingSystem:通过该MBean我们可以了解到JVM所运行在的操作系统上的一些相关信息,通过java.lang.management.OperatingSystemMXBean定义我们可以了解到其主要提供的功能
public interface OperatingSystemMXBean { public String getName(); public String getArch(); public String getVersion(); public int getAvailableProcessors(); public double getSystemLoadAverage(); }
SunJVM在此基础上提供更多的一些信息,可以通过com.sun.management.OperatingSystemMXBean了解一些额外可以获取到的信息
public interface OperatingSystemMXBean extends java.lang.management.OperatingSystemMXBean { long getCommittedVirtualMemorySize(); long getTotalSwapSpaceSize(); long getFreeSwapSpaceSize(); long getProcessCpuTime(); long getFreePhysicalMemorySize(); long getTotalPhysicalMemorySize(); }
2)Runtime:通过该MBean获取获取到JVM一些相关的信息,通过java.lang.management.RuntimeMXBean可以了解其主要提供的功能
public interface RuntimeMXBean { public String getName(); public String getVmName(); public String getVmVendor(); public String getVmVersion(); public String getSpecName(); public String getSpecVendor(); public String getSpecVersion(); public String getManagementSpecVersion(); public String getClassPath(); public String getLibraryPath(); public boolean isBootClassPathSupported(); public String getBootClassPath(); public java.util.List<String> getInputArguments(); public long getUptime(); public long getStartTime(); public java.util.Map<String, String> getSystemProperties(); }
可以通过RuntimeMXBean.getUptime()和OperatingSystemMXBean. getProcessCpuTime()来计算JVM占用的系统CPU比例的情况,JConsole的CPU视图就是通过这种方式计算的。
7.Threading:可以通过该MBean获取线程信息,包括线程状态、执行栈等。可以通过java.lang.management.ThreadMXBean了解其提供的主要功能
public interface ThreadMXBean { public int getThreadCount(); public int getPeakThreadCount(); public long getTotalStartedThreadCount(); public int getDaemonThreadCount(); public long[] getAllThreadIds(); public ThreadInfo getThreadInfo(long id); public ThreadInfo[] getThreadInfo(long[] ids); public ThreadInfo getThreadInfo(long id, int maxDepth); public ThreadInfo[] getThreadInfo(long[] ids, int maxDepth); public boolean isThreadContentionMonitoringSupported(); public boolean isThreadContentionMonitoringEnabled(); public void setThreadContentionMonitoringEnabled(boolean enable); public long getCurrentThreadCpuTime(); public long getCurrentThreadUserTime(); public long getThreadCpuTime(long id); public long getThreadUserTime(long id); public boolean isThreadCpuTimeSupported(); public boolean isCurrentThreadCpuTimeSupported(); public boolean isThreadCpuTimeEnabled(); public void setThreadCpuTimeEnabled(boolean enable); public long[] findMonitorDeadlockedThreads(); public void resetPeakThreadCount(); public long[] findDeadlockedThreads(); public boolean isObjectMonitorUsageSupported(); public boolean isSynchronizerUsageSupported(); public ThreadInfo[] getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers); public ThreadInfo[] dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers); }
二、编程获取到JVM Manage信息
我们可以通过JMX的方式读取到JVM Manage定义的MBean,如下是3种获取方法
1.监控应用与被监控应用位于同一JVM
MBeanServer server = ManagementFactory.getPlatformMBeanServer(); RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(server, "java.lang:type=Runtime", RuntimeMXBean.class);
2.监控应用与被监控应用不位于同一JVM
1)首先在被监控的JVM的启动参数中加入如下的启动参数以启JVM代理
2)连接到代理上
JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://127.0.0.1:8000/jmxrmi"); JMXConnector connector = JMXConnectorFactory.connect(url); RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(connector .getMBeanServerConnection(),"java.lang:type=Runtime", RuntimeMXBean.class);
3.监控应用与被监控应用不位于同一JVM但在同一物理主机上(2的特化情况,通过进程Attach)
我们使用JDK工具,如jmap、jstack等的时候,工具所在的JVM当然与被监控的JVM不是同一个,所以不能使用方式1,被监控的JVM一般也不会在启动参数中增加JMX的支持,所以方式2也没有办法。还好Sun JVM给我们提供了第3种非标准的方式,就是通过Attach到被监控的JVM进程,并在被监控的JVM中启动一个JMX代理,然后使用该代理通过2的方式连接到被监控的JVM的JMX上。下面是一个使用范例,由于里面使用到的知识涉及到Java Instrutment(JVMTI的一个技术的Java实现)和Attach API,因此此处不做详细解析,在后续看完Java Instrutment和Attach API自然就会明白。(注意,仅在JDK6+中支持,另外,运行需要jdk的tools.jar包)
//Attach 到5656的JVM进程上,后续Attach API再讲解 VirtualMachine virtualmachine = VirtualMachine.attach("5656"); //让JVM加载jmx Agent,后续讲到Java Instrutment再讲解 String javaHome = virtualmachine.getSystemProperties().getProperty("java.home"); String jmxAgent = javaHome + File.separator + "lib" + File.separator + "management-agent.jar"; virtualmachine.loadAgent(jmxAgent, "com.sun.management.jmxremote"); //获得连接地址 Properties properties = virtualmachine.getAgentProperties(); String address = (String)properties.get("com.sun.management.jmxremote.localConnectorAddress"); //Detach virtualmachine.detach(); JMXServiceURL url = new JMXServiceURL(address); JMXConnector connector = JMXConnectorFactory.connect(url); RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(connector .getMBeanServerConnection(), "java.lang:type=Runtime",RuntimeMXBean.class);
三、结束语
可以看到,通过标准的接口,我们已经可以获得运行的JVM很详细的信息,从运行JVM、操作系统,到内存、GC和线程,通过这些标准的接口我们已经可以对JVM进行功能完善的监控。但是仅此是不够的,这部分接口描述的主要是JVM的总体性的信息,而无法提供更多的细节。在下一部分,我们将使用JPDA来更深入地了解JVM内部信息更细节的信息,并了解我们如何通过JVM TI实现自动的性能监控
评论
呵呵,了解地越多,就越发现自己不懂的越多。
发表评论
-
DCE VM HotSwap增强
2011-03-13 19:16 2705我们知道,在 Sun Ho ... -
JVM Java HeapSpace到达临界值的高CPU问题
2010-08-08 18:50 4113本周有同事反馈,IDC环境出现了CPU非常高的问题, ... -
JNI——小心,内存怪兽出没
2010-07-29 06:55 17020最近有一个同 ... -
Sun JVM Memory&GC参数配置
2010-05-06 05:56 4541参考: 《Memory Management in the ... -
[Java性能剖析] TPTP性能剖析介绍
2010-05-01 23:00 6864TPTP(Test & Performance ... -
[Java性能剖析]Eclipse Memory Analyzer介绍
2010-05-01 08:48 12946Eclipse Memory Analyzer是一 ... -
Java 栈内存介绍
2010-04-30 23:01 10948本篇我们了解一下Java的栈内存空间。 ... -
[Java性能剖析]Sun JDK可视化性能剖析工具介绍
2010-04-29 22:51 3235除了一些基础的工具,随Sun JDK一起发布的还有 ... -
[Java性能剖析]Sun JDK基本性能剖析工具介绍
2010-04-29 13:40 3469Sun JDK随版本同时发布了一些性能剖析的工具,这 ... -
[Java性能剖析]Sun JVM Attach API
2010-04-29 07:11 10765Sun JVM Attach API是Sun JVM ... -
[Java性能剖析]JPDA 4)Java Instrutment
2010-04-28 21:42 5386在前面的介绍 ... -
[Java性能剖析]JPDA 3)JDI/Debuger
2010-04-28 13:17 3936参考:http://java.sun.com/jav ... -
[Java性能剖析]JPDA 2)JVM TI
2010-04-28 07:03 4533参考:http://java.sun.com/ja ... -
[Java性能剖析]JPDA 1)总体结构
2010-04-27 06:31 2661JPDA(Java Platform D ... -
[Java性能剖析]Sun JVM内存管理和垃圾回收
2010-04-24 18:39 14982内存管理和垃圾回收是JVM非常关键的点,对Jav ... -
[Java性能剖析]前言
2010-04-24 06:01 2730最近在学习Java性能剖析方面的主题,理论方面涉及 ... -
JVM内存管理和垃圾回收
2008-07-13 22:42 8144Java虚拟机的一个强大之 ...
相关推荐
《实战JAVA虚拟机—JVM故障诊断与性能优化》是一本深入探讨Java虚拟机(JVM)技术的书籍,旨在帮助开发者和系统管理员诊断并优化JVM相关的性能问题。本书内容丰富,涵盖了大量的实践案例,使得即便是初学者也能理解...
总结来说,Java性能分析涉及源码优化、JVM调优以及使用各种工具进行监控和诊断。深入理解这些知识点,对于提升Java应用的性能和稳定性至关重要。而压缩包中的"Java开源运行分析工具分类列表.mht"文件很可能包含了更...
2. **线程诊断**:查看和分析JVM中的线程状态,查找死锁或资源争抢问题。 3. **内存诊断**:实时查看堆和非堆内存使用情况,及时发现内存泄漏。 4. **类加载器监控**:跟踪类的加载、卸载,了解类的生命周期。 5....
它为开发者提供了丰富的API,可以用来实现诸如性能分析、内存检测、调试等高级功能。本文将深入探讨JVM TI的核心概念、主要功能以及如何使用它来监控Java执行过程。 一、JVM TI概述 JVM TI是Java虚拟机的一部分,...
本书旨在帮助开发人员、系统管理员和技术支持工程师更好地理解IBM Virtual Machine for Java(以下简称IBM JVM)的核心组件及其工作方式,并提供了一套全面的工具和技术来识别、分析和解决问题。 #### 二、目标读者...
- JMX(Java Management Extensions):用于监控和管理Java应用的工具和API。 - JConsole和VisualVM:两款常用的JVM性能分析工具,可以查看内存、线程、类加载等信息。 - 参数调整:学习如何通过JVM参数设置内存...
7. **性能监控**:SAP JVM提供了丰富的JMX(Java Management Extensions)和JFR(Java Flight Recorder)功能,帮助管理员监控和分析JVM的性能,如内存使用、线程状态、GC(垃圾收集)行为等。 总之,SAP JVM 8.1 ...
除此之外,JMX(Java Management Extensions)可以用于远程监控和管理Java应用,而火焰图工具如FlameGraph可以帮助我们直观地分析CPU热点。 此外,使用JDK自带的JMX和JConsole工具可以实时监控应用程序的运行状态,...
具体而言,这个官方指南提供了关于如何使用Java中提供的工具和API来监视和管理Java应用程序性能的知识。 首先,要理解Java监视和管理的范畴,需要关注Java平台中与性能相关的核心组件。Java虚拟机(Java Virtual ...
- **JConsole**:集成的JMX(Java Management Extensions)监控工具,用于监测和管理Java应用程序的性能和资源。 - **JVisualVM**:提供了一整套性能分析和内存泄漏检测工具,帮助开发者优化代码。 这个中文版的...
- **性能日志与剖析**:讨论了如何使用JFR(Java Flight Recorder)和JITWatch等工具进行深度性能分析。 3. **类加载与反射** - **类加载机制**:深入解析双亲委派模型,以及自定义类加载器的应用场景。 - **...
- **JMX(Java Management Extensions)**:提供标准API来管理资源。 #### 8. jvm堆分析 堆分析是诊断内存泄漏的关键手段之一。常用的堆分析工具包括: - **MAT(Memory Analyzer Tool)**:强大的内存分析工具。 -...
这些增强主要体现在Java监控和管理API(Management API)的扩展、图形化工具JConsole的正式支持,以及Java虚拟机(JVM)测试工具的升级。 首先,Java SE 5 的`java.lang.management`包通过定义9个MXBeans(管理扩展...
Java.lang.management包提供了对JVM运行环境的监控和管理能力,自J2SE5起新增,对于系统管理和故障诊断非常重要。 #### Java.lang.ref Java.lang.ref包激活了与垃圾收集器的交互,通过弱引用、软引用等机制,开发者...
在Java编程中,获取CPU和内存信息是系统监控和性能分析的重要部分。下面将详细讲解如何使用Java API来读取这些信息。 首先,对于内存信息的读取,Java提供了`java.lang.Runtime`类和`java.lang.management....
在IT行业中,对Java、Scala等运行于JVM(Java Virtual Machine)的程序进行实时日志采集是一项关键任务,尤其对于系统的性能分析和故障排查至关重要。日志是理解应用程序运行状态的重要线索,能够帮助开发者诊断问题...
了解和熟练使用这些Java API,开发者可以更好地理解和控制他们的Java应用程序在不同环境下的行为,这对于问题排查、性能调优和平台兼容性测试至关重要。因此,掌握这些知识点对于任何Java开发者来说都是必备的技能。
Java虽然不像C++或C#那样可以直接调用操作系统API,但它提供了Java Management Extensions (JMX) 和 Java Native Interface (JNI) 这样的工具来获取这些信息。下面我们将详细探讨如何使用Java来获取CPU和内存信息。 ...
这包括使用JMX(Java Management Extensions)进行远程监控,以及使用JConsole、VisualVM等工具进行本地分析。 3. **性能分析**:文档详细解释了如何分析Java应用程序的性能瓶颈,包括CPU使用率、内存分配、磁盘I/O...
2. **VisualVM**: Oracle提供的多合一Java应用性能分析工具,支持JMX连接。 3. **JMXTerm**: 命令行工具,用于交互式地与JMX服务器通信。 4. **自定义客户端**: 开发者也可以创建自己的JMX客户端,利用JMX API与...