在线提出的问题表明,开发人员偶尔希望通过其Java应用程序访问通常从针对该应用程序外部运行JConsole , VisualVM或JDK命令行工具获得的信息类型。 以下是这类问题的一些示例:
- 如何以编程方式获取jmap直方图?
- 以编程方式从Java应用程序中转储堆
- 查找运行哪种类型的垃圾收集器
我最近在博客上介绍了 jcmd 的用处 。 命令行JDK工具的“ 瑞士军刀 ”提供了有关运行Java进程的许多信息,并且开发人员可能希望通过编程方式获取的许多类型的信息都可以通过jcmd
。
“ JDK 8”页面中的“ 工具增强 ”指出:“ JDK 8提供了对诊断命令的远程访问,以前只能通过jcmd
工具在本地进行访问。 使用Java管理扩展(JMX)提供了远程访问,因此诊断命令将公开给注册到平台MBean服务器的平台MBean。 MBean是com.sun.management.DiagnosticCommandMBean
接口。” 在“ 在JConsole和VisualVM中查看DiagnosticCommandMBean”一文中 ,我研究了如何通过JConsole和VisualVM使用JMX和DiagnosticCommandMBean在运行的JVM进程上访问jcmd
类型信息。
在这篇文章中我看看如何使用com.sun.management.DiagnosticCommandMBean以编程方式访问信息提供jcmd 。
通过JMX使用ObjectName “ com.sun.management:type=DiagnosticCommand
”访问DiagnosticCommandMBean 。 大多数操作不需要参数,并且返回String
。 考虑到这一点,下面的代码片段展示了一种访问具有String[]
签名, String
返回类型并且实际上不需要参数的操作的通用方法。
设置DiagnosticCommandMBean和访问相同签名操作的通用方法
/** Object Name of DiagnosticCommandMBean. */public final static String DIAGNOSTIC_COMMAND_MBEAN_NAME ="com.sun.management:type=DiagnosticCommand";/** My MBean Server. */private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();/** Platform MBean Server. */private final ObjectName objectName;// . . ./*** Invoke operation on the DiagnosticCommandMBean that accepts* String array argument but does not require any String* argument and returns a String.** @param operationName Name of operation on DiagnosticCommandMBean.* @param operationDescription Description of operation being invoked* on the DiagnosticCommandMBean.* @return String returned by DiagnosticCommandMBean operation.*/private String invokeNoStringArgumentsCommand(final String operationName, final String operationDescription){String result;try{result = (String) server.invoke(objectName, operationName, new Object[] {null}, new String[]{String[].class.getName()});}catch (InstanceNotFoundException | ReflectionException | MBeanException exception){result = "ERROR: Unable to access '" + operationDescription + "' - " + exception;}return result;}
使用上面的代码,方法invokeNoStringArgumentsCommand(String, String)
可以用于访问DiagnosticCommandMBean
提供的一些操作。 与jcmd
一起使用时, help
子命令很有用,因为它列出了与指定Java进程关联的可用子命令。 同样, DiagnosticCommandMBean
提供的“帮助”操作在提供MBean支持的命令列表方面同样有帮助。 使用下面显示的代码(使用刚刚显示的代码)可以轻松访问此代码。
/*** Provide list of supported operations (help).** @return Single string containing names of supported operations.*/
public String getAvailableOperations()
{return invokeNoStringArgumentsCommand("help", "Help (List Commands)");
}
从一个简单的Java应用程序运行它会导致输出类似于下图所示:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
helpFor more information about a specific command use 'help '.
在我的博客文章“ 确定活动的HotSpot垃圾收集器”中 ,我写道jcmd
可用于标识正在运行的Java进程的VM标志,并且可以从这些标志中收集正在使用的垃圾收集器。 因为DiagnosticCommandMBean
支持如上所述的VM.flags
操作,所以该操作可用于查看VM标志并从这些标志中确定正在使用哪个收集器。 下一个代码清单显示了两个示例方法,第一个方法访问进程的VM标志,第二个方法提供了如何使用第一个方法来标识正在使用的垃圾收集器的简单示例。
获取虚拟机标志并标识活动垃圾收集器
/*** Provide a String representing the Virtual Machine flags.** @return String containing the virtual machine flags.*/
public String getVirtualMachineFlags()
{return invokeNoStringArgumentsCommand("vmFlags", "Determine VM flags");
}/*** Provide String representing active/current garbage collector.** @return String representation of current garbage collector* ("Parallel/Throughput", "Concurrent Mark Sweep (CMS)",* "Garbage First", or "UNDETERMINED").*/
public String determineGarbageCollector()
{String garbageCollector;final String vmFlags = getVirtualMachineFlags();if (vmFlags.contains("+UseParallelGC") || vmFlags.contains("+UseParallelOldGC")){garbageCollector = "Parallel/Throughput";}else if (vmFlags.contains("+UseConcMarkSweepGC")){garbageCollector = "Concurrent Mark Sweep (CMS)";}else if (vmFlags.contains("+UseG1GC")){garbageCollector = "Garbage First";}else{garbageCollector = "UNDETERMINED";}return garbageCollector;
}
接下来显示带有VM标志的字符串和已标识的垃圾收集器的输出:
-XX:CICompilerCount=3 -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2128609280 -XX:MaxNewSize=709361664 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Parallel/Throughput
已经显示的示例(访问帮助和VM标志)说明了相同的通用方法,该方法可用于以编程方式访问具有相同签名的DiagnosticCommandMBean
上的其他操作。 接下来显示一系列代码清单和相应的输出以说明其中的一些。
访问虚拟机正常运行时间
/*** Provide virtual machine uptime as single String.** @return Single string containing virtual machine uptime.*/
public String getVirtualMachineUptime()
{return invokeNoStringArgumentsCommand("vmUptime", "Virtual Machine Uptime");
}
0.272 s
访问线程转储
/*** Provide thread dump as single String.** @return Single string containing formatted thread dump.*/
public String getThreadDump()
{return invokeNoStringArgumentsCommand("threadPrint", "Thread Dump");
}
2016-04-30 20:21:22
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.25-b02 mixed mode):"Monitor Ctrl-Break" #10 daemon prio=5 os_prio=0 tid=0x00000000189ea800 nid=0x1590 runnable [0x000000001903e000]java.lang.Thread.State: RUNNABLEat java.net.DualStackPlainSocketImpl.accept0(Native Method)at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131)at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:404)at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199)- locked <0x0000000081208810> (a java.net.SocksSocketImpl)at java.net.ServerSocket.implAccept(ServerSocket.java:545)at java.net.ServerSocket.accept(ServerSocket.java:513)at com.intellij.rt.execution.application.AppMain$1.run(AppMain.java:90)at java.lang.Thread.run(Thread.java:745)"Service Thread" #9 daemon prio=9 os_prio=0 tid=0x0000000018915800 nid=0x2468 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C1 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x0000000017087000 nid=0x17a0 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x0000000017080000 nid=0x1560 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x000000001707d000 nid=0x2004 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001707b000 nid=0x2160 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001707a000 nid=0x458 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000000024f7000 nid=0x1964 in Object.wait() [0x00000000183ef000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x0000000081201570> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:142)- locked <0x0000000081201570> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:158)at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000000024ee000 nid=0x270c in Object.wait() [0x00000000182ef000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x0000000081208c28> (a java.lang.ref.Reference$Lock)at java.lang.Object.wait(Object.java:502)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)- locked <0x0000000081208c28> (a java.lang.ref.Reference$Lock)"main" #1 prio=5 os_prio=0 tid=0x0000000000c4e000 nid=0x24f8 waiting on condition [0x0000000000dee000]java.lang.Thread.State: RUNNABLEat sun.management.DiagnosticCommandImpl.executeDiagnosticCommand(Native Method)at sun.management.DiagnosticCommandImpl.access$000(DiagnosticCommandImpl.java:40)at sun.management.DiagnosticCommandImpl$Wrapper.execute(DiagnosticCommandImpl.java:128)at sun.management.DiagnosticCommandImpl.invoke(DiagnosticCommandImpl.java:230)at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)at dustin.examples.diagnostics.VirtualMachineDiagnostics.invokeNoStringArgumentsCommand(VirtualMachineDiagnostics.java:167)at dustin.examples.diagnostics.VirtualMachineDiagnostics.getThreadDump(VirtualMachineDiagnostics.java:88)at dustin.examples.diagnostics.VirtualMachineDiagnostics.main(VirtualMachineDiagnostics.java:187)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:483)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)"VM Thread" os_prio=2 tid=0x0000000017046000 nid=0x22b0 runnable "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000002417800 nid=0x1580 runnable "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002419000 nid=0x16d8 runnable "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000241a800 nid=0x177c runnable "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000241c800 nid=0x1974 runnable "VM Periodic Task Thread" os_prio=2 tid=0x0000000018918000 nid=0x10dc waiting on condition JNI global references: 15
获取类直方图
/*** Provide class histogram as single String.** @return Single string containing formatted class histogram.*/
public String getHistogram()
{return invokeNoStringArgumentsCommand("gcClassHistogram", "GC Class Histogram");
}
num #instances #bytes class name
----------------------------------------------1: 3485 243064 [C2: 467 124976 [B3: 992 104200 java.lang.Class4: 3452 82848 java.lang.String5: 1006 46744 [Ljava.lang.Object;6: 525 46200 java.lang.reflect.Method7: 309 22248 java.lang.reflect.Field8: 519 16608 java.util.HashMap$Node9: 326 11760 [Ljava.lang.String;10: 211 8968 [I11: 434 8312 [Ljava.lang.Class;12: 77 7416 [Ljava.util.HashMap$Node;13: 179 7160 java.lang.ref.SoftReference14: 101 5656 java.lang.Class$ReflectionData15: 73 4672 java.net.URL16: 97 4656 java.util.HashMap17: 89 4560 [Ljava.lang.reflect.Method;18: 189 4536 javax.management.ImmutableDescriptor19: 279 4464 java.lang.Integer20: 139 4448 java.util.Hashtable$Entry21: 105 4200 java.util.WeakHashMap$Entry22: 129 4128 java.util.concurrent.ConcurrentHashMap$Node23: 128 4096 com.sun.jmx.mbeanserver.ConvertingMethod24: 90 3600 java.util.TreeMap$Entry25: 34 3360 [Ljava.util.WeakHashMap$Entry;26: 8 3008 java.lang.Thread27: 45 2880 javax.management.openmbean.OpenMBeanAttributeInfoSupport28: 87 2784 java.lang.ref.WeakReference29: 160 2560 java.lang.Object30: 49 2544 [Ljavax.management.MBeanAttributeInfo;31: 135 2536 [Lcom.sun.jmx.mbeanserver.MXBeanMapping;32: 30 2400 java.lang.reflect.Constructor33: 48 2304 javax.management.MBeanInfo34: 49 1960 java.io.ObjectStreamField35: 60 1920 javax.management.MBeanAttributeInfo36: 46 1840 java.util.LinkedHashMap$Entry37: 38 1824 sun.util.locale.LocaleObjectCache$CacheEntry38: 44 1760 java.lang.ref.Finalizer39: 30 1752 [Ljava.lang.reflect.Field;40: 36 1728 sun.misc.URLClassPath$JarLoader41: 1 1712 [[B42: 40 1600 sun.management.DiagnosticCommandArgumentInfo43: 31 1488 java.util.WeakHashMap44: 60 1440 java.util.ArrayList45: 11 1392 [Ljava.util.Hashtable$Entry;46: 42 1344 java.lang.ref.ReferenceQueue47: 2 1320 [J48: 10 1312 [Ljava.util.concurrent.ConcurrentHashMap$Node;49: 26 1248 java.util.logging.LogManager$LoggerWeakRef50: 47 1120 [Ljavax.management.ObjectName$Property;51: 1 1040 [Ljava.lang.Integer;52: 39 1008 [Ljavax.management.MBeanOperationInfo;53: 24 960 javax.management.ObjectName54: 38 912 java.io.ExpiringCache$Entry55: 19 912 sun.management.DiagnosticCommandInfo56: 18 864 java.util.TreeMap57: 12 864 java.util.logging.Logger58: 35 840 javax.management.ObjectName$Property59: 15 840 javax.management.openmbean.ArrayType60: 20 800 com.sun.jmx.mbeanserver.MXBeanSupport61: 20 800 javax.management.MBeanOperationInfo62: 14 784 sun.nio.cs.UTF_8$Encoder63: 32 768 com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$IdentityMapping64: 12 768 java.util.jar.JarFile65: 19 760 sun.util.locale.BaseLocale$Key66: 15 720 java.lang.management.PlatformComponent67: 44 704 java.lang.ref.ReferenceQueue$Lock68: 11 704 java.util.concurrent.ConcurrentHashMap69: 21 672 com.sun.jmx.mbeanserver.WeakIdentityHashMap$IdentityWeakReference70: 7 672 java.util.jar.JarFile$JarFileEntry71: 12 672 java.util.zip.ZipFile$ZipFileInputStream72: 19 608 java.util.Locale73: 19 608 sun.management.DiagnosticCommandImpl$Wrapper74: 19 608 sun.util.locale.BaseLocale75: 18 576 javax.management.MBeanParameterInfo76: 10 560 java.util.LinkedHashMap77: 14 560 javax.management.openmbean.SimpleType78: 23 552 com.sun.jmx.mbeanserver.PerInterface$MethodAndSig79: 26 536 [Ljava.lang.reflect.Constructor;80: 22 528 com.sun.jmx.mbeanserver.NamedObject81: 22 528 sun.reflect.generics.tree.SimpleClassTypeSignature82: 13 520 java.security.AccessControlContext83: 16 512 java.util.logging.LogManager$LogNode84: 17 504 [Ljava.io.ObjectStreamField;85: 9 504 javax.management.openmbean.CompositeType86: 19 488 [Lsun.management.DiagnosticCommandArgumentInfo;87: 12 480 com.sun.jmx.mbeanserver.PerInterface88: 20 480 java.lang.Class$AnnotationData89: 20 480 java.util.Arrays$ArrayList90: 20 480 java.util.jar.Attributes$Name91: 19 456 [Ljavax.management.MBeanParameterInfo;92: 19 456 java.util.Locale$LocaleKey93: 14 448 java.util.concurrent.locks.ReentrantLock$NonfairSync94: 8 448 javax.management.openmbean.OpenMBeanParameterInfoSupport95: 20 440 [Ljavax.management.MBeanNotificationInfo;96: 13 416 java.io.File97: 22 408 [Lsun.reflect.generics.tree.TypeArgument;98: 10 400 java.io.FileDescriptor99: 10 400 sun.reflect.UnsafeQualifiedStaticObjectFieldAccessorImpl100: 1 384 java.lang.ref.Finalizer$FinalizerThread101: 6 384 java.nio.DirectByteBuffer102: 8 384 java.util.Hashtable103: 1 384 java.util.logging.LogManager$Cleaner104: 12 384 java.util.zip.ZipCoder105: 1 376 java.lang.ref.Reference$ReferenceHandler106: 15 360 javax.management.StandardMBean107: 22 352 sun.reflect.generics.tree.ClassTypeSignature108: 4 336 [D109: 7 336 com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$CompositeMapping110: 6 336 java.nio.DirectLongBufferU111: 14 336 java.util.concurrent.CopyOnWriteArrayList112: 6 336 sun.management.MemoryPoolImpl113: 14 336 sun.reflect.NativeConstructorAccessorImpl114: 16 328 [Ljava.lang.management.PlatformComponent;115: 4 320 [S116: 13 312 java.lang.management.ManagementPermission117: 9 288 java.lang.OutOfMemoryError118: 12 288 java.util.ArrayDeque119: 12 288 java.util.Collections$SingletonList120: 9 288 java.util.logging.Level121: 12 288 sun.misc.MetaIndex122: 5 280 sun.util.calendar.ZoneInfo123: 8 256 sun.misc.ProxyGenerator$PrimitiveTypeInfo124: 2 240 java.net.SocksSocketImpl125: 6 240 sun.management.MemoryPoolImpl$CollectionSensor126: 6 240 sun.management.MemoryPoolImpl$PoolSensor127: 6 240 sun.reflect.generics.repository.MethodRepository128: 14 224 java.util.concurrent.locks.ReentrantLock129: 14 224 sun.reflect.DelegatingConstructorAccessorImpl130: 13 216 [Ljavax.management.MBeanConstructorInfo;131: 9 216 java.util.logging.Level$KnownLevel132: 9 216 sun.util.logging.PlatformLogger$Level133: 10 208 [Ljava.lang.reflect.Type;134: 5 200 java.lang.ClassLoader$NativeLibrary135: 6 192 java.util.Vector136: 8 192 sun.reflect.generics.factory.CoreReflectionFactory137: 6 192 sun.reflect.generics.tree.MethodTypeSignature138: 2 176 java.net.DualStackPlainSocketImpl139: 9 168 [Lsun.reflect.generics.tree.FieldTypeSignature;140: 3 168 javax.management.openmbean.OpenMBeanOperationInfoSupport141: 9 160 [Lsun.reflect.generics.tree.FormalTypeParameter;142: 5 160 java.io.FileInputStream143: 4 160 java.security.ProtectionDomain144: 5 160 javax.management.MBeanNotificationInfo145: 5 160 javax.management.StandardEmitterMBean146: 6 144 java.util.LinkedList$Node147: 3 144 java.util.Properties148: 6 144 sun.misc.PerfCounter149: 6 144 sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl150: 6 144 sun.reflect.generics.scope.MethodScope151: 4 128 com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$ArrayMapping152: 2 128 java.io.ExpiringCache$1153: 4 128 java.security.CodeSource154: 8 128 java.util.HashSet155: 4 128 java.util.LinkedList156: 1 120 [[Ljava.lang.String;157: 5 120 sun.misc.FloatingDecimal$PreparedASCIIToBinaryBuffer158: 2 112 java.lang.Package159: 2 112 java.util.zip.ZipFile$ZipFileInflaterInputStream160: 1 96 [Ljava.lang.invoke.MethodType;161: 6 96 [Lsun.reflect.generics.tree.TypeSignature;162: 3 96 com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$EnumMapping163: 4 96 java.lang.RuntimePermission164: 2 96 java.lang.ThreadGroup165: 6 96 java.lang.ThreadLocal166: 2 96 java.nio.HeapByteBuffer167: 4 96 java.util.Collections$UnmodifiableRandomAccessList168: 3 96 java.util.Stack169: 2 96 java.util.zip.Inflater170: 2 96 javax.management.openmbean.TabularType171: 2 96 sun.management.GarbageCollectorImpl172: 2 96 sun.nio.cs.StreamEncoder173: 4 96 sun.reflect.annotation.AnnotationInvocationHandler174: 3 96 sun.reflect.generics.reflectiveObjects.TypeVariableImpl175: 3 96 sun.reflect.generics.repository.ClassRepository176: 1 88 sun.misc.Launcher$AppClassLoader177: 1 88 sun.misc.Launcher$ExtClassLoader178: 1 80 [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;179: 1 80 [Ljava.lang.invoke.LambdaForm;180: 2 80 com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$TabularMapping181: 2 80 java.io.BufferedWriter182: 2 80 java.io.ExpiringCache183: 2 80 java.lang.invoke.MethodType184: 2 80 java.util.IdentityHashMap185: 2 80 sun.management.MemoryManagerImpl186: 2 80 sun.misc.FloatingDecimal$BinaryToASCIIBuffer187: 2 80 sun.misc.URLClassPath188: 1 72 [Ljavax.management.openmbean.SimpleType;189: 3 72 java.lang.annotation.RetentionPolicy190: 1 72 java.lang.invoke.MethodTypeForm191: 3 72 java.net.InetAddress$InetAddressHolder192: 3 72 java.util.Collections$SynchronizedSet193: 1 72 java.util.logging.LogManager$RootLogger194: 3 72 sun.misc.FloatingDecimal$ExceptionalBinaryToASCIIBuffer195: 3 72 sun.reflect.NativeMethodAccessorImpl196: 3 72 sun.reflect.generics.tree.ClassSignature197: 3 72 sun.reflect.generics.tree.FormalTypeParameter198: 1 64 [F199: 2 64 [Ljava.lang.Thread;200: 2 64 [Ljava.lang.annotation.RetentionPolicy;201: 4 64 [Ljava.security.Principal;202: 2 64 com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$CollectionMapping203: 4 64 com.sun.proxy.$Proxy1204: 2 64 java.io.FileOutputStream205: 2 64 java.io.FilePermission206: 2 64 java.io.PrintStream207: 2 64 java.lang.ThreadLocal$ThreadLocalMap$Entry208: 2 64 java.lang.VirtualMachineError209: 2 64 java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry210: 2 64 java.lang.ref.ReferenceQueue$Null211: 2 64 java.lang.reflect.Proxy$Key1212: 2 64 java.lang.reflect.WeakCache$CacheValue213: 2 64 java.security.BasicPermissionCollection214: 2 64 java.security.Permissions215: 4 64 java.security.ProtectionDomain$Key216: 4 64 java.util.LinkedHashMap$LinkedValues217: 2 64 java.util.PropertyPermission218: 2 64 sun.reflect.annotation.AnnotationType219: 1 56 [Ljava.lang.Runnable;220: 3 56 [Lsun.reflect.generics.tree.ClassTypeSignature;221: 1 56 [Lsun.util.logging.PlatformLogger$Level;222: 1 56 java.lang.invoke.MemberName223: 1 56 java.util.logging.LogManager224: 3 48 [Ljava.lang.annotation.Annotation;225: 2 48 [Ljava.lang.reflect.TypeVariable;226: 1 48 [[Ljava.lang.Object;227: 2 48 com.sun.jmx.mbeanserver.ClassLoaderRepositorySupport$LoaderEntry228: 1 48 com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$Mappings229: 1 48 com.sun.jmx.mbeanserver.MBeanIntrospector$MBeanInfoMap230: 1 48 com.sun.jmx.mbeanserver.MBeanIntrospector$PerInterfaceMap231: 2 48 com.sun.jmx.mbeanserver.WeakIdentityHashMap232: 2 48 java.io.BufferedOutputStream233: 2 48 java.io.File$PathStatus234: 2 48 java.io.FilePermissionCollection235: 2 48 java.io.OutputStreamWriter236: 2 48 java.lang.StringBuilder237: 2 48 java.net.InetAddress238: 2 48 java.net.InetAddress$Cache239: 2 48 java.net.InetAddress$Cache$Type240: 2 48 java.nio.charset.CoderResult241: 3 48 java.nio.charset.CodingErrorAction242: 1 48 java.util.concurrent.locks.ReentrantReadWriteLock$FairSync243: 2 48 java.util.logging.Logger$LoggerBundle244: 2 48 java.util.zip.ZStreamRef245: 2 48 sun.management.ManagementFactoryHelper$1246: 2 48 sun.misc.NativeSignalHandler247: 2 48 sun.misc.Signal248: 1 48 sun.nio.cs.SingleByte$Decoder249: 3 48 sun.reflect.DelegatingMethodAccessorImpl250: 2 48 sun.reflect.generics.scope.ClassScope251: 2 40 [Lcom.sun.jmx.mbeanserver.ClassLoaderRepositorySupport$LoaderEntry;252: 1 40 [Ljava.lang.management.MemoryPoolMXBean;253: 1 40 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor254: 1 40 com.sun.jmx.mbeanserver.JmxMBeanServer255: 1 40 com.sun.jmx.mbeanserver.MBeanServerDelegateImpl256: 1 40 java.io.BufferedInputStream257: 1 40 sun.management.DiagnosticCommandImpl258: 1 40 sun.nio.cs.StandardCharsets$Aliases259: 1 40 sun.nio.cs.StandardCharsets$Cache260: 1 40 sun.nio.cs.StandardCharsets$Classes261: 1 40 sun.nio.cs.UTF_8$Decoder262: 1 32 [Ljava.lang.OutOfMemoryError;263: 2 32 [Ljava.lang.StackTraceElement;264: 1 32 [Ljava.lang.ThreadGroup;265: 1 32 [Ljava.lang.management.MemoryManagerMXBean;266: 1 32 com.sun.jmx.mbeanserver.Repository267: 1 32 java.io.WinNTFileSystem268: 1 32 java.lang.ArithmeticException269: 2 32 java.lang.Boolean270: 1 32 java.lang.NullPointerException271: 2 32 java.lang.Shutdown$Lock272: 1 32 java.lang.StringCoding$StringDecoder273: 1 32 java.lang.reflect.WeakCache274: 1 32 java.net.Socket275: 2 32 java.nio.ByteOrder276: 1 32 java.util.Collections$UnmodifiableMap277: 2 32 java.util.HashMap$EntrySet278: 1 32 java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl279: 1 32 java.util.logging.LogManager$SystemLoggerContext280: 1 32 javax.management.MBeanConstructorInfo281: 1 32 sun.management.MemoryImpl282: 2 32 sun.net.www.protocol.jar.Handler283: 1 32 sun.nio.cs.StandardCharsets284: 1 24 [Ljava.io.File$PathStatus;285: 1 24 [Ljava.lang.invoke.MethodHandle;286: 1 24 [Ljava.net.InetAddress$Cache$Type;287: 1 24 [Ljava.net.InetSocketAddress;288: 1 24 [Ljava.security.ProtectionDomain;289: 1 24 [Lsun.launcher.LauncherHelper;290: 1 24 com.sun.jmx.mbeanserver.ClassLoaderRepositorySupport291: 1 24 com.sun.jmx.mbeanserver.MXBeanLookup292: 1 24 com.sun.jmx.remote.util.ClassLogger293: 1 24 dustin.examples.diagnostics.VirtualMachineDiagnostics294: 1 24 java.lang.ThreadLocal$ThreadLocalMap295: 1 24 java.lang.invoke.LambdaForm$NamedFunction296: 1 24 java.lang.invoke.MethodType$ConcurrentWeakInternSet297: 1 24 java.lang.reflect.ReflectPermission298: 1 24 java.net.Inet4Address299: 1 24 java.net.Inet6AddressImpl300: 1 24 java.net.ServerSocket301: 1 24 java.util.BitSet302: 1 24 java.util.Collections$EmptyMap303: 1 24 java.util.Collections$SetFromMap304: 1 24 java.util.Locale$Cache305: 1 24 java.util.concurrent.atomic.AtomicLong306: 1 24 java.util.concurrent.locks.ReentrantReadWriteLock307: 1 24 java.util.jar.Manifest308: 1 24 java.util.logging.LogManager$LoggerContext309: 1 24 java.util.logging.LoggingPermission310: 1 24 javax.management.NotificationBroadcasterSupport311: 1 24 sun.launcher.LauncherHelper312: 1 24 sun.management.CompilationImpl313: 1 24 sun.management.OperatingSystemImpl314: 1 24 sun.management.RuntimeImpl315: 1 24 sun.management.ThreadImpl316: 1 24 sun.management.VMManagementImpl317: 1 24 sun.misc.JarIndex318: 1 24 sun.misc.URLClassPath$FileLoader319: 1 24 sun.nio.cs.ISO_8859_1320: 1 24 sun.nio.cs.MS1252321: 1 24 sun.nio.cs.ThreadLocalCoders$1322: 1 24 sun.nio.cs.ThreadLocalCoders$2323: 1 24 sun.nio.cs.US_ASCII324: 1 24 sun.nio.cs.UTF_16325: 1 24 sun.nio.cs.UTF_16BE326: 1 24 sun.nio.cs.UTF_16LE327: 1 24 sun.nio.cs.UTF_8328: 1 24 sun.util.locale.BaseLocale$Cache329: 1 16 [Ljava.lang.Throwable;330: 1 16 [Ljava.nio.file.attribute.FileAttribute;331: 1 16 [Ljava.security.cert.Certificate;332: 1 16 [Ljava.util.logging.Handler;333: 1 16 com.intellij.rt.execution.application.AppMain$1334: 1 16 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor$ResourceContext$1335: 1 16 com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory336: 1 16 com.sun.jmx.mbeanserver.DescriptorCache337: 1 16 com.sun.jmx.mbeanserver.MBeanAnalyzer$MethodOrder338: 1 16 com.sun.jmx.mbeanserver.MBeanInstantiator339: 1 16 com.sun.jmx.mbeanserver.MXBeanIntrospector340: 1 16 com.sun.jmx.mbeanserver.SecureClassLoaderRepository341: 1 16 java.io.FileDescriptor$1342: 1 16 java.lang.ApplicationShutdownHooks$1343: 1 16 java.lang.CharacterDataLatin1344: 1 16 java.lang.Runtime345: 1 16 java.lang.String$CaseInsensitiveComparator346: 1 16 java.lang.System$2347: 1 16 java.lang.Terminator$1348: 1 16 java.lang.invoke.MemberName$Factory349: 1 16 java.lang.management.PlatformComponent$1350: 1 16 java.lang.management.PlatformComponent$10351: 1 16 java.lang.management.PlatformComponent$11352: 1 16 java.lang.management.PlatformComponent$12353: 1 16 java.lang.management.PlatformComponent$13354: 1 16 java.lang.management.PlatformComponent$14355: 1 16 java.lang.management.PlatformComponent$15356: 1 16 java.lang.management.PlatformComponent$2357: 1 16 java.lang.management.PlatformComponent$3358: 1 16 java.lang.management.PlatformComponent$4359: 1 16 java.lang.management.PlatformComponent$5360: 1 16 java.lang.management.PlatformComponent$6361: 1 16 java.lang.management.PlatformComponent$7362: 1 16 java.lang.management.PlatformComponent$8363: 1 16 java.lang.management.PlatformComponent$9364: 1 16 java.lang.ref.Reference$Lock365: 1 16 java.lang.reflect.Proxy$KeyFactory366: 1 16 java.lang.reflect.Proxy$ProxyClassFactory367: 1 16 java.lang.reflect.ReflectAccess368: 1 16 java.net.InetAddress$2369: 1 16 java.net.URLClassLoader$7370: 1 16 java.nio.Bits$1371: 1 16 java.nio.Bits$1$1372: 1 16 java.nio.charset.CoderResult$1373: 1 16 java.nio.charset.CoderResult$2374: 1 16 java.security.ProtectionDomain$1375: 1 16 java.security.ProtectionDomain$3376: 1 16 java.util.Collections$EmptyIterator377: 1 16 java.util.Collections$EmptyList378: 1 16 java.util.Collections$EmptySet379: 1 16 java.util.Collections$SingletonSet380: 1 16 java.util.HashMap$Values381: 1 16 java.util.Hashtable$EntrySet382: 1 16 java.util.WeakHashMap$KeySet383: 1 16 java.util.concurrent.atomic.AtomicInteger384: 1 16 java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock385: 1 16 java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter386: 1 16 java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock387: 1 16 java.util.jar.Attributes388: 1 16 java.util.jar.JavaUtilJarAccessImpl389: 1 16 java.util.logging.LoggingProxyImpl390: 1 16 java.util.zip.ZipFile$1391: 1 16 javax.management.JMX392: 1 16 javax.management.MBeanServerBuilder393: 1 16 javax.management.NotificationBroadcasterSupport$1394: 1 16 sun.management.ClassLoadingImpl395: 1 16 sun.management.HotSpotDiagnostic396: 1 16 sun.management.ManagementFactoryHelper$PlatformLoggingImpl397: 1 16 sun.misc.ASCIICaseInsensitiveComparator398: 1 16 sun.misc.FloatingDecimal$1399: 1 16 sun.misc.Launcher400: 1 16 sun.misc.Launcher$Factory401: 1 16 sun.misc.Perf402: 1 16 sun.misc.Unsafe403: 1 16 sun.net.www.protocol.file.Handler404: 1 16 sun.nio.ch.FileChannelImpl$1405: 1 16 sun.reflect.ReflectionFactory406: 1 16 sun.reflect.generics.tree.TypeVariableSignature407: 1 16 sun.util.calendar.Gregorian
Total 16267 885480
jcmd
可用的某些子命令仅在使用-XX:+ UnlockDiagnosticVMOptions (在运行Java进程时指定)解锁诊断操作时才可用。 如下面的代码清单和输出清单所示,对于DiagnosticCommandMBean
对应对象而言,情况就是如此。
访问班级统计
/*** Provide class statistics as single String.** This is only supported when {@code -XX:+UnlockDiagnosticVMOptions} is enabled.** @return Single string containing formatted class statistics.*/
public String getClassStatistics()
{return invokeNoStringArgumentsCommand("gcClassStats", "GC Class Statistics");
}
GC.class_stats command requires -XX:+UnlockDiagnosticVMOptions
我尚未看到对DiagnosticCommandMBean
一个jcmd
子命令是用于生jcmd
转储的命令( jcmd
的GC.heap_dump
)。 据我所知,通过查看VisualVM和JConsole中的已公开操作以及查看由上述“帮助”操作列出的可用命令, DiagnosticCommandMBean
没有公开任何等效操作。 尽管DiagnosticCommandMBean
似乎没有提供用于调用堆转储的操作,但是另一个MBean(对象名称为com.sun.management:type=HotSpotDiagnostic的com.sun.management.HotSpotDiagnostic)执行了操作“ dumpHeap”,并对此进行了演示在A. Sundararajan的博客文章“以编程方式从Java应用程序中转储堆 ”中。
结论
DiagnosticCommandMBean
提供了jcmd的大部分功能,因此它使Java应用程序可以使用jcmd功能来针对自己运行该功能。
这篇文章中显示的代码清单可在GitHub上的类VirtualMachineDiagnostics
找到 。 我将来可能会添加或修改此类,但原始版本的代码与本文中所示的相同。
翻译自: https://www.javacodegeeks.com/2016/05/programmatic-jcmd-access.html