【问题标题】:How to view the current heap size that an application is using?如何查看应用程序正在使用的当前堆大小?
【发布时间】:2011-01-02 04:41:09
【问题描述】:

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

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

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

有没有办法验证这一点?

【问题讨论】:

    标签: java netbeans heap-memory


    【解决方案1】:

    使用此代码:

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

    知道它对我很有用。

    【讨论】:

    • 如果您使用此策略,您将需要重新编译您的应用程序 (NetBeans)。
    • 根据文档:docs.oracle.com/javase/7/docs/api/java/lang/…。上面提到的方法返回JVM中的内存不一定是Heap Memory
    • 请注意,并非您使用-J-Xmx 1g 指定的所有堆大小都必须可用于您的应用程序的对象。 VM,尤其是垃圾收集器,可能会使用其中的一些内存。 Here's 更多关于该主题的内容。
    【解决方案2】:
    public class CheckHeapSize {
    
        public static void main(String[] args) {
            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("heap size: " + formatSize(heapSize));
            System.out.println("heap max size: " + formatSize(heapMaxSize));
            System.out.println("heap free size: " + 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));
        }
    }
    

    【讨论】:

    • 使用此代码以人类可读的格式获取内存的 HeapSize
    • 1 KB (1 KB) = 1000 字节。 1 kibibyte (1 KiB) = 1024 字节。
    【解决方案3】:

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

    【讨论】:

    • 这包括内存使用、线程和类的实时图表。非常有用。
    【解决方案4】:

    你可以通过 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 的值可能未定义。

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

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

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

        +----------------------------------------------+
        +////////////////           |                  +
        +////////////////           |                  +
        +----------------------------------------------+
    
        |--------|
           init
        |---------------|
               used
        |---------------------------|
                  committed
        |----------------------------------------------|
                            max
    

    作为补充说明,maxMemory 小于 -Xmx,因为至少在一个空的生存空间中存在必要性,它不能用于堆分配。

    也值得看看here,尤其是here

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 二进制文件名为 jvisualvm(.exe)。不知道为什么。
      【解决方案6】:

      个人最喜欢当 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】:

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

        非常有用。

        【讨论】:

          猜你喜欢
          • 2017-06-03
          • 2013-02-07
          • 1970-01-01
          • 2016-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多