我正在运行某个Java程序,其-Xmx
高于-Xms
,即它的堆可以增长。执行端的堆大小(IIRC)不是运行期间使用的最大值。
答案 0 :(得分:4)
获取当前堆大小:
public static long getHeapSize(){
int mb = 1024*1024;
//Getting the runtime reference from system
Runtime runtime = Runtime.getRuntime();
return ((runtime.totalMemory() - runtime.freeMemory()) / mb);
}
答案 1 :(得分:2)
如果要从程序本身检查它,请使用Runtime类的方法:
Runtime.getRuntime().freeMemory()
Runtime.getRuntime().maxMemory()
如果可以从程序外部检查堆大小,则应使用JVisualVM。您可以在JDK的bin文件夹中找到它。只需启动它,并附加到您的Java程序,以深入了解您的程序堆使用情况。它将显示堆使用情况的图表,以便于查找程序运行的最大堆大小。
答案 2 :(得分:2)
//以字节为单位获取堆的当前大小
long heapSize = Runtime.getRuntime().totalMemory();
//以字节为单位获取最大堆大小。堆不能超过这个大小。任何尝试都会导致OutOfMemoryException。
long heapMaxSize = Runtime.getRuntime().maxMemory();
//获取堆内可用内存量(以字节为单位)。垃圾收集后这个大小会增加//随着新对象的创建而减少。
long heapFreeSize = Runtime.getRuntime().freeMemory();
答案 3 :(得分:2)
其他答案提供了通过Runtime.getRuntime()。totalMemory()和maxMemory()进行操作的机制,但要非常小心 - 给出的答案仅在给定时刻才为真。在GC之后,totalMemory()将改变(向下!)。您无法始终准确地查看“系统中有多少活动对象” - 因为这正是GC计算的,并且价格昂贵。
使用JMX(参见GC bean等)将有助于轮询,但同样,这是一段时间的样本。
所以我不确定你在这里要解决的是什么......
答案 4 :(得分:1)
请参阅运行时信息:
Runtime.getRuntime().maxMemory();
Runtime.getRuntime().totalMemory();
Runtime.getRuntime().freeMemory();
答案 5 :(得分:0)
jps
和jstat
命令的组合非常强大,足以跟踪您的Java内存详细信息。
使用jps
命令获取java进程的pid,并使用jstat $pid
获取java程序的详细信息。
现在,您可以在循环中运行它们并密切监视java程序的内存详细信息。
你可以在github找到这个想法的bash实现。这个脚本的一大优点是你可以启动这个脚本,然后运行你的java程序。您将能够从最开始看到程序的内存详细信息。