6

我正在运行某个 Java 程序,其-Xmx高于-Xms,即它的堆可以增长。执行结束时的堆大小是(IIRC)而不是运行期间使用的最大值。

  • 如何获取当前的堆大小?
  • 除了定期轮询“我自己”的当前大小之外,如何在运行过程中获得最大堆大小?
4

6 回答 6

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);
}
于 2013-02-18T13:26:55.467 回答
2

如果要从程序本身检查它,请使用Runtime类的方法:

Runtime.getRuntime().freeMemory()
Runtime.getRuntime().maxMemory()

如果您可以从程序外部检查堆大小,则应使用 JVisualVM。您可以在 JDK 的 bin 文件夹中找到它。只需启动它,并附加到您的 java 程序,以深入了解您的程序堆使用情况。它将显示您的堆使用情况图表,从而可以轻松找到程序运行时的最大堆大小。

于 2013-02-18T13:26:40.677 回答
2

// 获取堆的当前大小(以字节为单位)

long heapSize = Runtime.getRuntime().totalMemory(); 

// 获取堆的最大大小(以字节为单位)。堆不能超过这个大小。// 任何尝试都将导致 OutOfMemoryException。

long heapMaxSize = Runtime.getRuntime().maxMemory();

// 以字节为单位获取堆内的空闲内存量。// 在垃圾回收之后,这个大小会增加,并随着新对象的创建而减少。

long heapFreeSize = Runtime.getRuntime().freeMemory(); 
于 2013-02-18T13:26:51.193 回答
2

其他答案提供了通过 Runtime.getRuntime().totalMemory() 和 maxMemory() 执行的机制,但要非常小心 - 给出的答案仅在给定的时刻是正确的。GC 后,totalMemory() 将改变(向下!)。您无法始终完全准确地了解“系统中有多少活动对象”——因为这正是 GC 计算的内容,而且成本很高。

使用 JMX(请参阅 GC bean 等)将有助于进行轮询,但同样,随着时间的推移,它是一个示例。

所以我不确定你到底想在这里解决什么......

于 2013-02-18T21:51:58.817 回答
1

查看运行时信息:

Runtime.getRuntime().maxMemory();
Runtime.getRuntime().totalMemory();
Runtime.getRuntime().freeMemory();
于 2013-02-18T13:27:50.663 回答
0

jps和command 的组合jstat真的很强大,可以跟踪你的 java 内存细节。

使用该jps命令获取您的 java 进程的 pid,并使用该命令获取您jstat $pid的 java 程序的详细信息。现在您可以循环运行它们并密切监视您的 java 程序的内存细节。

你可以在github上找到这个想法的 bash 实现。该脚本的一大优点是您可以启动该脚本,然后运行您的 java 程序。您将能够从一开始就看到程序的内存详细信息。

于 2018-04-07T18:26:33.457 回答