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

Java 如何查看应用程序正在使用的当前堆大小?,java,netbeans,heap,heap-memory,Java,Netbeans,Heap,Heap Memory,我想我在NetBeans中将堆大小增加到了1GB,因为我更改了配置,如下所示: netbeans_default_options="-J-Xmx1g ...... 在我重新启动NetBeans之后,我可以确保我的应用程序现在被赋予1GB吗 有没有办法验证这一点?您可以使用jconsole(大多数JDK的标准配置)来检查任何java进程的堆大小。使用以下代码: // Get current size of heap in bytes long heapSize = Runtime.getRunt

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

netbeans_default_options="-J-Xmx1g ......
在我重新启动NetBeans之后,我可以确保我的应用程序现在被赋予1GB吗

有没有办法验证这一点?

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

使用以下代码:

// 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(); 

了解它对我很有用。

随附Sun Java 6 JDK的jvisualvm。将列出启动标志。

您可以使用以下工具:Eclipse内存分析器工具

它非常有用。

公共类CheckHeapSize{
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));
    }
}
公共静态void main(字符串[]args){ //TODO自动生成的方法存根 long heapSize=Runtime.getRuntime().totalMemory(); //获取堆的最大大小(字节)。堆不能超过此大小//任何尝试都将导致OutOfMemoryException。 long heapMaxSize=Runtime.getRuntime().maxMemory(); //获取堆内的可用内存量(字节)。此大小将在垃圾收集后增加//并在创建新对象时减少。 long heapFreeSize=Runtime.getRuntime().freemory(); System.out.println(“heapsize”+formatSize(heapsize)); System.out.println(“heapmaxsize”+formatSize(heapmaxsize)); System.out.println(“heapFreesize”+formatSize(heapFreesize)); } 公共静态字符串formatSize(长v){ 如果(v<1024)返回v+“B”; intz=(63-长.前导零数(v))/10;
返回String.format(“%.1f%sB”,(双精度)v/(1L当jvisualvm过度使用或仅需要cli时的个人最爱:


你可以用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()
(取自模式)

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


同样值得一看,尤其是你需要重新编译你的应用程序(NetBeans)如果您使用此策略。如doc:.所述,上述方法返回JVM中的内存不一定是堆内存。请注意,并非您使用
-J-Xmx 1g
指定的所有堆大小都必须可用于应用程序的对象。VM,尤其是垃圾收集器,可能会使用部分内存。请进一步了解.T主题his包括内存使用、线程和类的实时图表。非常有用。二进制文件名为jvisualvm(.exe)。不知道为什么。使用此代码以人类可读的格式获取内存的堆大小1 KB(1 KB)=1000字节。1 KB(1 KB)=1024字节。
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

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

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