如何查看应用程序正在使用的当前堆大小?

时间:2010-01-06 19:09:13

标签: java netbeans heap heap-memory

我认为我在NetBeans中将堆大小增加到1 GB,因为我将配置更改为如下所示:

netbeans_default_options="-J-Xmx1g ......

重新启动NetBeans后,我可以确定我的应用程序现在已经获得1 GB吗?

有没有办法验证这个?

8 个答案:

答案 0 :(得分:146)

使用此代码:

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory(); 

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();

 // Get amount of free memory within the heap in bytes. This size will increase // after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory(); 

了解它对我很有用。

答案 1 :(得分:8)

您可以使用jconsole(大多数JDK标准)来检查任何java进程的堆大小。

答案 2 :(得分:5)

public class CheckHeapSize {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        long heapSize = Runtime.getRuntime().totalMemory(); 

        // Get maximum size of heap in bytes. The heap cannot grow beyond this size.// Any attempt will result in an OutOfMemoryException.
        long heapMaxSize = Runtime.getRuntime().maxMemory();

         // Get amount of free memory within the heap in bytes. This size will increase // after garbage collection and decrease as new objects are created.
        long heapFreeSize = Runtime.getRuntime().freeMemory(); 

        System.out.println("heapsize"+formatSize(heapSize));
        System.out.println("heapmaxsize"+formatSize(heapMaxSize));
        System.out.println("heapFreesize"+formatSize(heapFreeSize));

    }
    public static String formatSize(long v) {
        if (v < 1024) return v + " B";
        int z = (63 - Long.numberOfLeadingZeros(v)) / 10;
        return String.format("%.1f %sB", (double)v / (1L << (z*10)), " KMGTPE".charAt(z));
    }
}

答案 3 :(得分:2)

使用Sun Java 6 JDK中的jvisualvm进行附加。列出了启动标志。

答案 4 :(得分:1)

您可以使用该工具:Eclipse Memory Analyzer Tool http://www.eclipse.org/mat/

非常有用。

答案 5 :(得分:1)

您可以通过MXBeans来实现

public class Check {
    public static void main(String[] args) {
        MemoryMXBean memBean = ManagementFactory.getMemoryMXBean() ;
        MemoryUsage heapMemoryUsage = memBean.getHeapMemoryUsage();

        System.out.println(heapMemoryUsage.getMax()); // max memory allowed for jvm -Xmx flag (-1 if isn't specified)
        System.out.println(heapMemoryUsage.getCommitted()); // given memory to JVM by OS ( may fail to reach getMax, if there isn't more memory)
        System.out.println(heapMemoryUsage.getUsed()); // used now by your heap
        System.out.println(heapMemoryUsage.getInit()); // -Xms flag

        // |------------------ max ------------------------| allowed to be occupied by you from OS (less than xmX due to empty survival space)
        // |------------------ committed -------|          | now taken from OS
        // |------------------ used --|                    | used by your heap

    }
}

但是请记住,它等同于Runtime.getRuntime()(从here中获取描绘的架构)

memoryMxBean.getHeapMemoryUsage().getUsed()      <=> runtime.totalMemory() - runtime.freeMemory()
memoryMxBean.getHeapMemoryUsage().getCommitted() <=> runtime.totalMemory()
memoryMxBean.getHeapMemoryUsage().getMax()       <=> runtime.maxMemory()

来自javaDoc

init -表示内存的初始存储量(以字节为单位) Java虚拟机从操作系统请求内存 启动过程中的管理。 Java虚拟机可能会请求 操作系统中的其他内存,并且可能还会释放 随着时间的推移存储到系统中。 init的值可能不确定。

已使用-表示当前使用的内存量(以字节为单位)。

已提交-表示内存量(以字节为单位) 保证可供Java虚拟机使用。的 提交的内存量可能会随时间而变化(增加或减少 减少)。 Java虚拟机可能会向系统释放内存 和 committed 可能小于 init 已承诺将始终 大于或等于已使用

max -表示可以存储的最大内存量(以字节为单位) 用于内存管理。它的值可能是不确定的。最大值 如果定义,内存量可能会随时间变化。使用量 如果为max,则已提交的内存将始终小于或等于max 被定义为。如果尝试增加内存分配可能会失败 即使已使用 <= 最大会使用的已使用内存,以使已使用> 已提交 仍然为真(例如,当系统虚拟内存不足时)。

    +----------------------------------------------+
    +////////////////           |                  +
    +////////////////           |                  +
    +----------------------------------------------+

    |--------|
       init
    |---------------|
           used
    |---------------------------|
              committed
    |----------------------------------------------|
                        max

请注意,maxMemory小于-Xmx,因为至少有一个空的生存空间是必要的,该空间不能用于堆分配。

同样值得一看的是here,尤其是here

答案 6 :(得分:0)

当jvisualvm过度或你只需要cli时,个人喜欢:jvmtop

JvmTop 0.8.0 alpha   amd64  8 cpus, Linux 2.6.32-27, load avg 0.12
https://github.com/patric-r/jvmtop

PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46

答案 7 :(得分:-1)

要检查您的Java应用程序堆大小和CPU时间,请使用将访问JVM并显示所有堆和CPU时间分配的JProfiler工具

插件可用于eclipse和intellej Idea IDE

下载Jprofiler链接

http://www.ej-technologies.com/download/jprofiler/files