// 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();
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));
}
}
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
}
}
7条答案
按热度按时间jjjwad0x1#
使用此代码:
知道这件事对我很有用。
a7qyws3x2#
7rfyedvj3#
您可以通过MXBeans来实现
但请记住,它等效于
Runtime.getRuntime()
(从here中获取所描述的模式)来自javaDoc
init-代表Java虚拟机器在启动时,从操作系统要求的内存管理初始内存数量(以字节为单位)。Java虚拟机器可能会从操作系统要求额外的内存,也可能会在一段时间后释放内存给系统。init的值可能未定义。
used-表示当前使用的内存量(字节)。
committed-表示保证可供Java虚拟机使用的内存量(以字节为单位)。已提交的内存量可能会随时间而变化(增加或减少)。Java虚拟机可能会向系统释放内存,并且committed可能小于init。committed将始终大于或等于used。
max-表示最大内存量(以字节为单位)。它的值可以是未定义的。如果定义了最大内存量,它可能会随时间而改变。如果定义了最大值,则已用内存量和已提交内存量将始终小于或等于最大值。如果试图增加已用内存,使used〉committed即使used〈=max仍为真(例如,当系统虚拟内存不足时)。
作为补充说明,maxMemory小于-Xmx,因为至少有一个空生存空间是必要的,该空间不能用于堆分配。
此外,值得看一看here,尤其是这里
pvabu6sv4#
您可以使用jconsole(大多数JDK的标准)来检查任何java进程的堆大小。
2exbekwf5#
使用Sun Java 6 JDK中的jvisualvm进行连接。将列出启动标志。
jutyujz06#
当jvisualvm是矫枉过正或您需要cli-only时,个人最喜欢的:jvmtop
gcxthw6b7#
您可以使用该工具:Eclipse内存分析器工具http://www.eclipse.org/mat/。
这是非常有用的。