如何dynamic监控Java堆大小?

我正在尝试dynamic监视Java堆大小。 有谁知道如何获得在运行一段代码的过程中使用的最大内存? Runtime.maxMemory()有诀窍吗? 谢谢

maxMemory()返回java将使用的最大内存量。 所以这不会得到你想要的。 totalMemory()是你正在寻找,但。 请参阅文档

有大量的探查工具可以帮助你。 一个stream行的商业工具是YourKit ,并得到好评如潮。 一个免费的select是VisualVM ,我曾经使用过,可以提供很多的洞察力。

如果你喜欢,你可以通过JConsole可视化地查看许多分析你的应用程序的值。

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jconsole.html

开始您的应用程序:

 -Dcom.sun.management.jmxremote 

而且您启动/bin/jconsole.exe时,您的应用程序将可供select

 jstat -gc <pid> <time> <amount> 
 jstat -gc `jps -l | grep weblogic\.Server | awk {'print $1'}` 1000 3 

3个样品1秒1 在这里看到更多

我还想补充说, jmap -heap <PID>没有办法。 这是假设你是一个操作员,并需要知道多less堆的Java进程正在使用。 我不能告诉你的问题是编程的,还是可操作的。

还有java.lang.management包。 使用ManagementFactory来获得一个MemoryMXBean实例。 它有方法返回堆和非堆内存使用快照。

也许jvmtop值得一看。 这是一个命令行工具,它提供了几个指标的实时视图,包括堆大小:

  JvmTop 0.4.1 alpha amd64 8 cpus, Linux 2.6.32-27, load avg 0.12 http://code.google.com/p/jvmtop PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL 3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21 27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31 19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20 16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46 

我们使用OpNet的应用程序内部xpert来监视堆使用情况和实时泄漏在我们的负载testing环境和生产。 它足够轻便,不会影响产品,所以我们可以获得我们无法从质量保证获得的好数据。 我们还在两种环境中分析方法和数据库调用,以帮助我们找出要优化的代码/ SQL。 非常酷的东西与漂亮的趋势图,但没有任何伸展自由。 如果您的应用程序拥有大量的资金,那么投资是值得的。

http://www.opnet.com/solutions/application_performance/appinternals-xpert.html

另一个免费的select是使用Java监视器 。 看看这个现场演示 。 只需单击任何服务器即可查看有关堆内存,非堆内存,文件描述符,数据库池等的详细图表。