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

mrb*_*lah 53 java heap netbeans heap-memory

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

netbeans_default_options="-J-Xmx1g ......
Run Code Online (Sandbox Code Playgroud)

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

有没有办法验证这个?

Dre*_*wen 159

使用此代码:

// 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(); 
Run Code Online (Sandbox Code Playgroud)

知道它对我很有用.

  • 根据文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#freeMemory()。上面提到的方法返回的是JVM中的内存,不一定是堆内存 (5认同)

Ale*_*ing 8

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


ram*_*mar 6

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用此代码以人类可读的格式获取内存的 HeapSize (2认同)

Ale*_*lex 5

你可以通过 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

    }
}
Run Code Online (Sandbox Code Playgroud)

但请记住,它等效于Runtime.getRuntime()(从此处获取描述的架构)

memoryMxBean.getHeapMemoryUsage().getUsed()      <=> runtime.totalMemory() - runtime.freeMemory()
memoryMxBean.getHeapMemoryUsage().getCommitted() <=> runtime.totalMemory()
memoryMxBean.getHeapMemoryUsage().getMax()       <=> runtime.maxMemory()
Run Code Online (Sandbox Code Playgroud)

来自javaDoc

init - 表示 Java 虚拟机在启动期间从操作系统请求用于内存管理的初始内存量(以字节为单位)。Java 虚拟机可能会向操作系统请求额外的内存,也可能会随着时间的推移向系统释放内存。init 的值可能未定义。

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

已提交- 表示保证可供 Java 虚拟机使用的内存量(以字节为单位)。提交的内存量可能会随时间变化(增加或减少)。Java 虚拟机可能会向系统释放内存,并且提交的内存可能小于initcommited总是大于或等于used

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

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

    |--------|
       init
    |---------------|
           used
    |---------------------------|
              committed
    |----------------------------------------------|
                        max
Run Code Online (Sandbox Code Playgroud)

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

也值得一看这里,尤其是这里