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