如何动态监控Java堆大小?

39

我正在尝试动态监测Java堆大小。有人知道如何获取运行代码过程中使用的最大内存吗?Runtime.maxMemory()是否可以实现这个功能?谢谢。

9个回答

32

maxMemory() 方法返回 Java 最多可以使用的内存。因此,这并不能满足你的需求。而你需要用的是 totalMemory() 方法。请参考文档


13

有很多性能分析工具可以帮助您解决这个问题。一个流行的商业工具是YourKit,它备受好评。另一个免费选择是VisualVM,我过去曾使用过它,并且可以提供很多见解。


一个老的帖子,但还是要评论一下。VisualVM易于使用,并且很好地满足了我的线程编程需求。感谢建议。 - rc1

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

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

每秒采集3个样本 点击这里了解更多


11

9

我还想补充一点,jmap -heap <PID> 就可以解决问题;假设你是运维人员并且需要知道Java进程使用了多少堆内存。我无法确定你的问题是编程方面的还是运维方面的。


4

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

1
我们在负载测试环境和生产环境中使用OpNet的应用程序内部xpert来实时监测堆使用情况和泄漏。它足够轻便,不会影响生产环境,因此我们可以获得无法从QA中获取的优秀数据。我们还在两个环境中对方法和数据库调用进行分析,以帮助我们找出需要优化的代码/SQL。非常酷的东西,具有漂亮的趋势图表,但价格不菲。如果您的应用程序投入了大量资金,这是值得投资的。

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


0
另一个免费的选择是使用Java-monitor。请查看这个实时演示。只需点击任何服务器,即可查看有关堆内存、非堆内存、文件描述符、数据库连接池等详细图表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接