第60天:通过编程生成JVM堆转储
#100daysofcode #java #jvm

JVM堆

首先,在我们抛弃堆之前,我们应该解开什么是堆以及为什么要倒掉它。在JVM中,Java堆是用于存储JVM上运行的应用程序实例化对象的内存区域。启动JVM时,只要应用程序正在运行,就可以创建堆内存,并且可以在线程之间共享堆中的任何对象。堆的大小可能会有所不同,因此许多用户将Java堆大小限制在2-8 GB,以最大程度地减少垃圾收集的暂停。

为什么要倾倒堆内存

堆转储是在某个时刻记忆中所有对象的快照。它们对于解决内存渗透问题并优化Java应用程序中的内存使用非常有用。

堆转储通常存储在binary format hprof files中。我们可以使用JVisualVMEclipse Memory Analyzing Tool

等工具打开和分析这些文件。

要生成一个堆转储,我们首先需要获得一个连接到堆,然后创建堆转储文件。因此,我们需要Java的JMX框架的帮助。

什么是JMX

Java管理扩展(JMX)是Java平台的标准组件。首先将其添加到J2SE 5.0版本中。这是用于网络和应用程序管理的一组规范。它为开发人员指定了一种通过将Java对象与管理属性分配给他们的网络管理软件的应用程序的方法。

JMX为开发人员提供了一种管理资源的标准和简单方法。包括服务,设备和应用程序。它是动态的,可以在创建,实施或安装后立即管理和监视资源。

什么是女人和男人

使用Java Management扩展技术,资源由托管豆或MBEAN代表。这些已在MBEAN服务器上注册。它是由核心管理的对象服务器,可充当代理,可以在支持Java的大多数设备上使用。

用更简单的话来说,mbeans的作用像

的Java包装器
  1. 服务
  2. 组件
  3. 设备
  4. 应用程序

在分布式网络中。

mbean服务器提供实际管理,因为它可以找到所有可管理的资源。然后,该服务器成为架构框架的主要重点。允许服务器组件插入并查找可管理的对象。

JMX代理将由MBEAN服务器组成,以及处理MBEAN所需的服务(您还需要一个APM解决方案,其中包括应用程序框架指标,例如MBEAN和Performance Counters)。这意味着资源是独立的,除管理基础架构外。虽然这些资源是可以管理的,无论管理应用程序如何部署。

因此,现在通过使用这些MBEAN和MBEANSERVER,我们可以获得许多有关JVM和托管应用的信息。

编程进行堆转储

首先,我们需要致电PlatformMBeanServer来获取JVM的平台信息,然后借助这些信息,需要访问HotSpotDiagnosticMXBean Whic是一个与典型MBEAN不同的管理扩展名。

所以让我们了解什么是MXBEAN

mxban

mxbeans只是一种特殊的mbeans。主要区别是MXBEAN限制了数据类型,因此它们与潜在客户“更兼容”。

例如:mbean可以公开数据类型Foo的属性。现在,客户还需要具有这种类型的Foo来理解属性。

MXBean试图将数据类型限制为那些already available,例如-java.lang。* etc。

程序

提取堆转储

  1. 首先需要获取PlatformMXBeanServer
  2. 在这种情况下,需要获得特定的mxbean
  3. 由于该过程不是线程安全的,我们需要将其进行Sychronize
  4. 现在我们需要在热点诊断上调用dumpHeap方法
  5. 要调用此方法,我们需要传递文件名(带有.hprof扩展名)和布尔值选项,以获取有关堆中的实时对象的信息。
  6. 它将在指定的locaiton中返回文件

代码

class Day60 {
    private static final String HotSpotBeanName = "com.sun.management:type=HotSpotDiagnostic";
    private static volatile HotSpotDiagnosticMXBean hotSpotDiagnosticMXBean;

    public static void main(String[] args) throws IOException {
        String timestamp = LocalDateTime.now().toString();
        System.out.println("Dumping heap");
        generateHeapDump("/home/mohibul/Documents/heapdump_"+timestamp+".hprof", true);
    }

    private static void generateHeapDump(String fileName, boolean isLive) throws IOException {
        if (hotSpotDiagnosticMXBean == null) {
            synchronized (Day60.class) {
                hotSpotDiagnosticMXBean = getHotSpotDiagnosticMXBean();
            }
        }

        hotSpotDiagnosticMXBean.dumpHeap(fileName,isLive);
    }

    private static HotSpotDiagnosticMXBean getHotSpotDiagnosticMXBean() throws IOException {
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        return ManagementFactory.newPlatformMXBeanProxy(mBeanServer, HotSpotBeanName, HotSpotDiagnosticMXBean.class);
    }
}