JVM堆
首先,在我们抛弃堆之前,我们应该解开什么是堆以及为什么要倒掉它。在JVM中,Java堆是用于存储JVM上运行的应用程序实例化对象的内存区域。启动JVM时,只要应用程序正在运行,就可以创建堆内存,并且可以在线程之间共享堆中的任何对象。堆的大小可能会有所不同,因此许多用户将Java堆大小限制在2-8 GB,以最大程度地减少垃圾收集的暂停。
为什么要倾倒堆内存
堆转储是在某个时刻记忆中所有对象的快照。它们对于解决内存渗透问题并优化Java应用程序中的内存使用非常有用。
堆转储通常存储在binary format hprof files
中。我们可以使用JVisualVM
和Eclipse Memory Analyzing Tool
要生成一个堆转储,我们首先需要获得一个连接到堆,然后创建堆转储文件。因此,我们需要Java的JMX
框架的帮助。
什么是JMX
Java管理扩展(JMX)是Java平台的标准组件。首先将其添加到J2SE 5.0版本中。这是用于网络和应用程序管理的一组规范。它为开发人员指定了一种通过将Java对象与管理属性分配给他们的网络管理软件的应用程序的方法。
JMX为开发人员提供了一种管理资源的标准和简单方法。包括服务,设备和应用程序。它是动态的,可以在创建,实施或安装后立即管理和监视资源。
什么是女人和男人
使用Java Management扩展技术,资源由托管豆或MBEAN代表。这些已在MBEAN服务器上注册。它是由核心管理的对象服务器,可充当代理,可以在支持Java的大多数设备上使用。
用更简单的话来说,mbeans的作用像
的Java包装器- 服务
- 组件
- 设备
- 应用程序
在分布式网络中。
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。
程序
提取堆转储
- 首先需要获取
PlatformMXBeanServer
。 - 在这种情况下,需要获得特定的mxbean
- 由于该过程不是线程安全的,我们需要将其进行Sychronize
- 现在我们需要在热点诊断上调用
dumpHeap
方法 - 要调用此方法,我们需要传递文件名(带有
.hprof
扩展名)和布尔值选项,以获取有关堆中的实时对象的信息。 - 它将在指定的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);
}
}