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

我想我在 NetBeans 中将堆大小增加到了1GB,因为我把配置改成了这样:

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

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

有办法证实吗?

140078 次浏览

您可以使用 jsole (大多数 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();

知道这件事对我很有用。

附加来自 SunJava6JDK 的 jvisalvm。

您可以使用该工具: Eclipse 内存分析器工具 http://www.eclipse.org/mat/

非常有用。

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

个人最喜欢的当 jvisalvm 是过度杀伤或你需要 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

你可以用 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()(从 给你获取描述的模式)

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

JavaDoc

控件的初始内存量(以字节为单位) Java 虚拟机从操作系统请求内存 管理。 Java 虚拟机可能会请求 来自操作系统的额外内存,也可以释放 内存到系统。 init 的值可能是未定义的。

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

Commit -表示的内存量(以字节为单位)为 保证可供 Java 虚拟机使用 提交内存的数量可能随着时间的推移而变化(增加或 Java 虚拟机可以向系统释放内存 和 坚定不移可以小于 Init坚定不移将永远是 大于或等于 用过

Max -表示可以使用的最大内存量(以字节为单位) 用于内存管理。它的值可能是未定义的。最大 内存的数量可能随着时间的变化,如果定义。使用的数量 提交内存总是小于或等于 max,如果 max 内存分配可能会失败,如果它试图增加 使用的内存使 用过 > 坚定不移即使 用过 < = Max会 仍然为真(例如,当系统的虚拟内存不足时)。

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


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

另外,maxMemory 小于-Xmx,因为至少在一个空的生存空间中有必要,这个空间不能用于堆分配。

同样值得一看的是 给你,特别是 给你