import java.io.BufferedWriter; import java.io.FileWriter; import javax.management.openmbean.CompositeData; import javax.management.remote.JMXServiceURL; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import com.sun.tools.attach.VirtualMachine; import com.sun.tools.attach.VirtualMachineDescriptor; import com.sun.tools.attach.spi.AttachProvider; public class JVMRuntimeClient { public static void main(String[] args) throws Exception { try { final AttachProvider attachProvider = AttachProvider.providers() .get(0); VirtualMachineDescriptor descriptor = null; for (VirtualMachineDescriptor virtualMachineDescriptor : attachProvider .listVirtualMachines()) { if (pickThisOne(virtualMachineDescriptor)) { descriptor = virtualMachineDescriptor; break; } } if (descriptor == null) throw new RuntimeException("You didn't pick one"); final VirtualMachine virtualMachine = attachProvider .attachVirtualMachine(descriptor); virtualMachine .loadAgent( "/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/management-agent.jar", "com.sun.management.jmxremote"); final Object portObject = virtualMachine.getAgentProperties().get( "com.sun.management.jmxremote.localConnectorAddress"); final JMXServiceURL target = new JMXServiceURL(portObject + ""); JMXConnector connector = JMXConnectorFactory.connect(target); MBeanServerConnection remote = connector.getMBeanServerConnection(); int c = remote.getMBeanCount(); System.out.println(c); BufferedWriter bfw = new BufferedWriter(new FileWriter("/home/ec2-user/jmx/heap.csv")); while (true) { CompositeData composite = (CompositeData) remote.getAttribute( new ObjectName("java.lang:type=Memory"), "HeapMemoryUsage"); StringBuffer sb = new StringBuffer(composite.get("committed") .toString()); sb.append(",").append(composite.get("init")).append(",") .append(composite.get("max")) .append(composite.get("used")); bfw.write(sb.toString()); bfw.newLine(); System.out.println(composite.get("committed")); System.out.println(composite.get("init")); System.out.println(composite.get("max")); System.out.println(composite.get("used")); } // connector.close(); } catch (Exception e) { e.printStackTrace(); System.exit(0); } } private static boolean pickThisOne( VirtualMachineDescriptor virtualMachineDescriptor) { System.out.println(virtualMachineDescriptor.displayName()); if (virtualMachineDescriptor.displayName().equals( "org.codehaus.plexus.classworlds.launcher.Launcher test") || virtualMachineDescriptor .displayName() .equals("org.codehaus.plexus.classworlds.launcher.Launcher -B test")) return true; // TODO return false; } }
相关推荐
1. **JVM监控**: JMX可以通过MBeans提供JVM的性能指标,如内存使用情况、线程状态、类加载统计等。 2. **Garbage Collection调优**: 使用JMX,可以监视垃圾收集器的运行情况,甚至动态调整GC参数。 3. **类加载...
Java JVM(Java虚拟机)内存分配与调优是Java...通过理解JVM内存模型,选择合适的垃圾收集器和设置合理的内存参数,可以有效提升Java应用的性能和稳定性。在实践中,不断学习和试验,才能找到最适合应用的内存配置。
内存管理涉及JVM内存区域,包括堆、栈、方法区、程序计数器和本地方法栈,每部分都有其特定的用途和管理方式。 2. JVM内存模型:JVM内存模型定义了内存中各个部分的关系,以及在多线程环境下如何共享和分配内存。...
本指南将深入探讨JVM内存模型,以及如何通过调整相关参数来优化性能。 首先,我们需要理解JVM的内存结构。JVM内存主要分为以下几个区域: 1. **堆(Heap)**:这是Java对象的主要存储区域,分为年轻代(Young ...
jconsole是一款轻量级的监控工具,主要功能包括查看JVM的状态信息、线程信息、内存使用情况等。虽然它的功能相对较少,但对于初级用户来说已经足够使用。通过jconsole,用户可以直观地看到JVM的CPU使用率、堆内存...
JVM内存分为多个区域,包括堆内存、方法区、程序计数器、虚拟机栈和本地方法栈。理解这些区域的工作原理以及如何优化它们对于提升Java应用程序的性能至关重要。 1. **堆内存**:堆内存是Java对象的主要存储区域,...
4. **内存监控**:内存监控是通过Java管理扩展API(JMX)提供的Runtime/MemoryMXBean和MemoryPoolMXBean来实现,可以监控整个堆内存和各个内存池的使用情况。 接着,文档介绍了堆内存的监控和设置参数: 1. **堆...
监控工具如JConsole、VisualVM和JMX(Java Management Extensions)提供了查看JVM状态、内存使用情况、线程信息等功能,帮助开发者识别性能瓶颈和内存泄漏。例如,通过监控内存使用情况,可以及时发现长期存活的对象...
- 监控和调整应用程序的性能,例如内存使用、线程状态、类加载等。 - 实时查看和修改应用程序的配置。 - 收集日志和跟踪信息,用于故障排查。 - 管理数据库连接池、MQ服务等资源。 ### 阅读材料推荐 压缩包中的`...
在进行JVM调优时,需要结合监控工具(如VisualVM、JConsole或JMX)来观察内存使用情况,分析垃圾收集日志,找出内存泄漏或性能瓶颈。对于频繁Full GC的情况,可能需要增大堆内存或优化对象分配策略。对于长期存活的...
通过理解JVM内存结构,熟练运用监控工具,并结合实际应用情况进行调优和GC优化,可以有效提升Java应用程序的性能和稳定性。在实践中,应根据应用特点和资源限制进行细致的测试和调整,以达到最佳运行效果。
首先,创建一个本地代理,注册内存使用相关的事件监听器,当内存分配、释放或垃圾收集发生时,记录相关信息。然后,通过分析这些数据,我们可以发现长时间未被释放的对象,从而定位潜在的内存泄漏问题。 五、JVM TI...
它能够帮助开发者和系统管理员深入了解Java虚拟机(JVM)的状态,包括内存使用、线程活动、类装载、MBeans(Managed Beans)以及虚拟机的各种信息。此外,Jconsole还支持执行MBean公开的方法,以及强制进行垃圾回收...
JVM内存模型主要分为堆内存、栈内存、方法区、程序计数器和本地方法栈五个部分。其中,堆内存用于存储对象实例,栈内存则处理方法调用,方法区存储类的信息,程序计数器记录下一条指令的地址,而本地方法栈服务于...
- **堆内存分析**:"Memory"选项卡用于查看堆内存使用情况,包括对象分配、GC活动和内存泄漏检测。 - **类加载**:"Classes"选项卡展示类加载情况,包括已加载的类数量、类加载和卸载的详细信息。 - **线程分析**...
通过它可以直接查看内存使用情况、CPU使用率、线程状态等信息。 **4.2 JConsole** JConsole也是JDK自带的一款监控工具,它可以显示运行时的各种统计数据,如类装载信息、内存使用情况、线程信息等,并且支持远程...
这些工具可以帮助开发者监控JVM的运行状态,包括GC的次数和时间、内存使用情况等。 jstat命令提供了一个强大的工具用于监控Java虚拟机中的堆使用情况和GC的状态。使用例如"-gccapacity"、"-gccause"、"-gcutil"等...
它能够实时显示JVM的运行信息,包括内存使用情况、线程状态、类加载、垃圾收集、CPU使用率等,为开发者提供了一个直观的界面,方便快速定位问题。 二、jvisualvm的主要功能 1. **内存监控**:jvisualvm可以展示堆...
3. 内存模型:JVM内存分为堆、栈、方法区、本地方法栈、程序计数器等几部分。其中,堆是对象存储的地方,栈处理方法调用,方法区存储类信息。 4. 垃圾收集:JVM的自动内存管理关键在于垃圾收集,包括可达性分析、...