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

mepcadol  于 2022-11-10  发布在  其他
关注(0)|答案(7)|浏览(141)

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

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

在重新启动NetBeans后,我是否可以确保现在为我的应用程序分配了1 GB的空间?
有办法验证吗?

jjjwad0x

jjjwad0x1#

使用此代码:

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

知道这件事对我很有用。

a7qyws3x

a7qyws3x2#

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));
    }
}
7rfyedvj

7rfyedvj3#

您可以通过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可能小于initcommitted将始终大于或等于used
max-表示最大内存量(以字节为单位)。它的值可以是未定义的。如果定义了最大内存量,它可能会随时间而改变。如果定义了最大值,则已用内存量和已提交内存量将始终小于或等于最大值。如果试图增加已用内存,使usedcommitted即使used〈=max仍为真(例如,当系统虚拟内存不足时)。

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

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

作为补充说明,maxMemory小于-Xmx,因为至少有一个空生存空间是必要的,该空间不能用于堆分配。
此外,值得看一看here,尤其是这里

pvabu6sv

pvabu6sv4#

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

2exbekwf

2exbekwf5#

使用Sun Java 6 JDK中的jvisualvm进行连接。将列出启动标志。

jutyujz0

jutyujz06#

当jvisualvm是矫枉过正或您需要cli-only时,个人最喜欢的: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
gcxthw6b

gcxthw6b7#

您可以使用该工具:Eclipse内存分析器工具http://www.eclipse.org/mat/
这是非常有用的。

相关问题