Java程序如何跟踪其运行期间使用的最大实际堆大小?

时间:2013-02-18 13:23:42

标签: java memory jvm heap

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

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

6 个答案:

答案 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)

jpsjstat命令的组合非常强大,足以跟踪您的Java内存详细信息。

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

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