如何动态监控Java堆大小?

时间:2010-01-29 16:12:12

标签: java monitoring heap

我正在尝试动态监视java堆大小。有人知道如何在运行一段代码的过程中获得最大内存吗? Runtime.maxMemory()可以解决这个问题吗?感谢

9 个答案:

答案 0 :(得分:28)

maxMemory()返回java将使用的最大内存量。所以那不会得到你想要的东西。 totalMemory()正是您所寻找的。请参阅docs

答案 1 :(得分:13)

有大量的探查器工具可以帮助您解决这个问题。一个流行的商业工具是YourKit,它得到好评如潮。一个免费的替代品是VisualVM,我过去曾使用它,可以提供很多见解。

答案 2 :(得分:11)

如果您愿意,可以直观地查看使用JConsole分析应用程序的大量值。

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

使用以下命令启动您的应用程序:

-Dcom.sun.management.jmxremote

当您启动/bin/jconsole.exe

时,您的应用程序将可供选择

答案 3 :(得分:11)

jstat -gc <pid> <time> <amount>

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

3个样品1秒 see more here

答案 4 :(得分:6)

我还想补充说jmap -heap <PID>可以解决问题;假设你是一个操作员,需要知道Java进程使用了​​多少堆。我无法判断你的问题是程序化的还是可操作的。

答案 5 :(得分:4)

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

答案 6 :(得分:2)

也许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

答案 7 :(得分:1)

我们使用OpNet的app internals xpert在我们的负载测试环境和生产中实时监控堆使用和泄漏。它的重量轻,不会影响prod,因此我们可以获得QA无法获得的优质数据。我们还在两个环境中分析方法和db调用,以帮助我们确定要优化的代码/ sql。非常酷的东西与漂亮的趋势图表,但不是任何伸展自由。如果你的应用程序上有很多美元,那就值得投资。

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

答案 8 :(得分:0)

另一种免费替代方案是使用Java-monitor。看看这个live demo。只需单击任何服务器即可查看堆内存,非堆内存,文件描述符,数据库池等详细信息。