`
wydyyhwzx
  • 浏览: 9522 次
社区版块
存档分类
最新评论

JVM工具类

jvm 
阅读更多

JVM工具类,提供jstack jmap memory等信息的输出.

import java.io.File;
import java.io.OutputStream;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.management.MBeanServer;
import javax.management.ObjectName;

import com.sun.management.HotSpotDiagnosticMXBean;


public class JVMUtil {

    private static final String HOTSPOT_BEAN_NAME = "com.sun.management:type=HotSpotDiagnostic";
    private static volatile HotSpotDiagnosticMXBean hotspotMBean;
    private static volatile MemoryMXBean memoryMBean;

    private static Object lock = new Object();

    public static void jMap(String fileName, boolean live) throws Exception {
        try {
            initHotspotMBean();
            File f = new File(fileName);
            if (f.exists()) {
                f.delete();
            }
            hotspotMBean.dumpHeap(fileName, live);
        } catch (Exception e) {
            throw e;
        }
    }

    public static void jstack(OutputStream stream) throws Exception {
        try {
            Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
            Iterator<Map.Entry<Thread, StackTraceElement[]>> ite = map.entrySet().iterator();
            while (ite.hasNext()) {
                Map.Entry<Thread, StackTraceElement[]> entry = ite.next();
                StackTraceElement[] elements = entry.getValue();
                if (elements != null && elements.length > 0) {
                    String threadName = entry.getKey().getName();
                    stream.write(("Thread Name :[" + threadName + "]\n").getBytes());
                    for (StackTraceElement el : elements) {
                        String stack = el.toString() + "\n";
                        stream.write(stack.getBytes());
                    }
                    stream.write("\n".getBytes());
                }
            }
        } catch (Exception e) {
            throw e;
        }
    }

    public static double memoryUsed(OutputStream stream) throws Exception {
        try {
            initMemoryMBean();
            stream.write("**********************************Memory Used**********************************\n".getBytes());
            String heapMemoryUsed = memoryMBean.getHeapMemoryUsage().toString() + "\n";
            stream.write(("Heap Memory Used: " + heapMemoryUsed).getBytes());
            String nonHeapMemoryUsed = memoryMBean.getNonHeapMemoryUsage().toString() + "\n";
            stream.write(("NonHeap Memory Used: " + nonHeapMemoryUsed).getBytes());

            return (double) (memoryMBean.getHeapMemoryUsage().getUsed()) / memoryMBean.getHeapMemoryUsage().getMax();
        } catch (Exception e) {
            throw e;
        }
    }

    private static HotSpotDiagnosticMXBean getHotspotMBean() throws Exception {
        try {
            return AccessController.doPrivileged(new PrivilegedExceptionAction<HotSpotDiagnosticMXBean>() {
                public HotSpotDiagnosticMXBean run() throws Exception {
                    MBeanServer server = ManagementFactory.getPlatformMBeanServer();
                    Set<ObjectName> s = server.queryNames(new ObjectName(HOTSPOT_BEAN_NAME), null);
                    Iterator<ObjectName> itr = s.iterator();
                    if (itr.hasNext()) {
                        ObjectName name = itr.next();
                        HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(server,
                                name.toString(), HotSpotDiagnosticMXBean.class);
                        return bean;
                    } else {
                        return null;
                    }
                }
            });
        } catch (Exception exp) {
            throw exp;
        }
    }

    private static MemoryMXBean getMemoryMBean() throws Exception {
        try {
            return AccessController.doPrivileged(new PrivilegedExceptionAction<MemoryMXBean>() {
                public MemoryMXBean run() throws Exception {
                    return ManagementFactory.getMemoryMXBean();
                }
            });
        } catch (Exception exp) {
            throw exp;
        }
    }

    private static void initHotspotMBean() throws Exception {
        if (hotspotMBean == null) {
            synchronized (lock) {
                if (hotspotMBean == null) {
                    hotspotMBean = getHotspotMBean();
                }
            }
        }
    }

    private static void initMemoryMBean() throws Exception {
        if (memoryMBean == null) {
            synchronized (lock) {
                if (memoryMBean == null) {
                    memoryMBean = getMemoryMBean();
                }
            }
        }
    }
}

 

分享到:
评论

相关推荐

    idea插件JVM内存工具JProfiler11

    IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能调优,其中就包括JProfiler11这款强大的JVM内存分析工具。本文将详细介绍如何使用Idea中的JProfiler11插件,...

    JVM 监控 调优 工具

    1. **JConsole**:这是Java SDK自带的一个图形化监控工具,可以查看JVM的内存使用情况、线程状态、类加载情况等。 2. **VisualVM**:功能更为强大的多合一JVM分析工具,提供CPU和内存分析、线程快照、方法Profiling...

    JVM分析工具

    `jstat` 是Java监控和诊断工具的一部分,用于收集JVM的各种运行时统计信息,如垃圾收集器的状态、类装载情况、内存使用等。它能实时监控JVM性能,对性能调优非常有帮助。例如,`jstat -gc`可以显示垃圾回收的详细...

    jvm工具、参数调优&调试技巧

    ### JVM工具、参数调优与调试技巧 #### 一、JVM工具 ##### 1. jps:虚拟机进程状况工具 - **简介**:`jps` 是一个用于显示当前运行的所有Java虚拟机进程(JVMs)的简单工具。它会列出每个JVM的PID(进程ID)以及...

    JVM实战-JVM类加载机制案例分析

    ### JVM实战-JVM类加载机制案例分析 #### 实验背景与目标 本次实验的主要目的是深入理解Java虚拟机(JVM)中的类加载机制。通过实践操作,掌握类的加载、连接与初始化过程,了解不同类型的类加载器及其工作原理,...

    jvm监控工具介绍

    JVM(Java Virtual Machine)是Java程序运行的基础,它负责解释和执行字节码,管理内存,以及处理线程和类加载。为了有效地监控和调试Java应用程序,Oracle JDK提供了多种强大的命令行工具,如jconsole、jmap、jstat...

    jvm工具、参数调优&调试技巧(补充+修正版)

    《JVM工具、参数调优&调试技巧》 在Java开发中,理解并掌握JVM(Java虚拟机)的工作原理及优化技术是至关重要的。本文将深入探讨JVM的工具、参数调优以及调试技巧,旨在帮助开发者提升应用性能,减少系统故障。 一...

    (二)MATJVM 内存分析工具.MAT JVM 内存分析工具.MAT JVM 内存分析工具.

    2. **对象计数**:工具可以统计特定类的对象数量,如果数量异常增加,可能意味着存在内存泄漏。 3. **引用链分析**:MAT可以显示对象间的引用路径,帮助找出导致对象无法被垃圾收集的原因。 4. **DOM泄漏分析**:...

    MAT JVM 内存分析工具.

    MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的Java虚拟机(JVM)内存分析工具。它被广泛用于诊断和解决Java应用程序中的内存泄漏、内存消耗过高以及性能问题。MAT提供了一种直观的方式来查看和理解堆内存的...

    JVM调优工具分享

    为了有效地进行JVM调优,开发人员和运维人员通常会使用各种工具。本文将详细介绍两款常用的JVM调优工具——JConsole和VisualVM。 首先,JConsole是Java 5及更高版本JDK自带的一款监控和管理控制台。它基于JMX(Java...

    jvm内存监控工具使用

    jstat 是一个用于监视 JVM 内存使用情况的强大工具,它可以提供有关堆内存、非堆内存、类加载和垃圾收集器活动的详细信息。通过 jstat,你可以监控 JVM 各个区域的内存使用率,包括年轻代、老年代和永久代,这对于...

    jvm常用命令工具

    **用途**:监控JVM的各种运行状态信息,包括类装载、垃圾回收、运行时编译等。 **命令格式**: ``` jstat [generalOption | outputOption] vmid [interval[s|ms] [count]] ``` **执行示例**: ``` jstat -gcutil ...

    深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

    被动使用则是在JVM运行过程中,由于JVM或JDK内部需要而进行的加载,如JNI查找类、JDK工具类的使用等。 在Java开发中,理解JVM的类加载机制对于优化性能、解决类冲突问题、实现自定义类加载器等都有重要意义。例如,...

    jvm内存分析工具mat安装包

    MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的JVM内存分析工具,尤其适用于诊断Java应用程序的内存泄漏问题。在Java开发过程中,内存溢出(Out Of Memory)问题常常会导致程序异常终止,而MAT就是解决这类...

    用JVM工具接口创建调试和分析代理.docx

    例如,可以使用`jvmtiEnv-&gt;Get*Info`函数获取关于JVM、类、线程和方法的详细信息。同时,通过注册事件回调,代理可以在特定事件发生时接收通知,例如`jvmtiEvent`中的`VMStart`、`ClassLoad`或`AllocationEvent`等。...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    1. JVM原理:JVM的工作原理涉及类加载器(ClassLoader)、类文件(ClassFile)、内存管理及垃圾收集机制。类加载器负责将.class文件加载到内存中,为程序的运行准备数据结构。内存管理涉及JVM内存区域,包括堆、栈、...

    JVM参数调优及JAVA相关工具使用

    永久代存储类元数据,现代JVM(如Java 8及以上版本)使用元空间(Metaspace)代替。 Java相关工具,如JConsole、VisualVM、JProfiler等,可以帮助监控和分析JVM的运行状态,包括内存使用、垃圾收集、线程和CPU负载...

Global site tag (gtag.js) - Google Analytics