java - 以编程方式检查可用的 heapSize?

标签 java memory memory-leaks jvm

我正在使用 Eclipse。问题是如果分配的内存小于 512MB,我的应用程序就会崩溃。现在无论如何在开始大量内存耗尽处理之前检查程序的可用内存? 例如,我知道我们可以检查可用的 JVM 堆大小:

long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Heap Size = " + heapSize);

问题是,这给出了 JVM 堆大小。即使增加它也不能使用 Eclipse。在 Eclipse 中,如果我更改 VM 参数,那么它可以工作。但是,上述语句的打印输出始终相同。是否有任何命令可以让我准确知道我为特定应用程序分配了多少内存?

最佳答案

您可以使用 JMX在运行时收集堆内存的使用情况。


代码示例:

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryType;
import java.lang.management.MemoryUsage;

for (MemoryPoolMXBean mpBean: ManagementFactory.getMemoryPoolMXBeans()) {
    if (mpBean.getType() == MemoryType.HEAP) {
        System.out.printf(
            "Name: %s: %s\n",
            mpBean.getName(), mpBean.getUsage()
        );
    }
}

输出示例:

Name: Eden Space: init = 6619136(6464K) used = 3754304(3666K) committed = 6619136(6464K) max = 186253312(181888K)
Name: Survivor Space: init = 786432(768K) used = 0(0K) committed = 786432(768K) max = 23265280(22720K)
Name: Tenured Gen: init = 16449536(16064K) used = 0(0K) committed = 16449536(16064K) max = 465567744(454656K)

如果您对“Eden Space”或“Survivor Space”有任何疑问,请查看 How is the java memory pool divided

关于java - 以编程方式检查可用的 heapSize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6487802/

相关文章:

java - 在menu.xml中使用actionLayout时android中的NullPointerException

linux - 使用 SIGALRM 和计时器时内存损坏

javascript - 为什么这段代码会导致 IE 内存泄漏?

java - 遗留 servlet 应用程序的 OIDC 过滤器

java - 哪个 2D 游戏引擎适用于 native 应用程序内的跨平台模块

java - con.getInputStream() 在 Android 项目中抛出异常,如何解决?

windows - 如果在特定地址写入则暂停进程

linux - Linux中有没有可以从虚拟地址确定物理地址的API?

android - 带有 UI 和内存泄漏的保留 fragment

ios - 由于内部保留周期,ViewController 没有被释放