如何动态监控 Java 堆大小?

Posted

技术标签:

【中文标题】如何动态监控 Java 堆大小?【英文标题】:How to dynamically monitor Java heap size? 【发布时间】:2011-01-10 22:01:11 【问题描述】:

我正在尝试动态监控 java 堆大小。有谁知道如何获得在运行一段代码的过程中使用的最大内存? Runtime.maxMemory() 能解决问题吗?谢谢

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

有大量可用的分析器工具可以帮助您解决这个问题。一个流行的商业工具是YourKit,它得到了热烈的评价。一个免费的替代方案是VisualVM,我过去曾使用过它,它可以提供很多见解。

【讨论】:

一个旧线程,但无论如何都在评论。 VisualVM 易于使用,很好地满足了我的线程编程需求。谢谢你的建议。【参考方案3】:
jstat -gc <pid> <time> <amount>

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

3 个样本 1 一秒 see more here

【讨论】:

【参考方案4】:

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

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

开始您的应用程序:

-Dcom.sun.management.jmxremote

当您启动 /bin/jconsole.exe 时,您的应用程序将可供选择

【讨论】:

【参考方案5】:

我还想补充一点,jmap -heap &lt;PID&gt; 可以解决问题;那是假设您是一名运维人员并且需要知道 Java 进程正在使用多少堆。我不知道您的问题是程序化的还是可操作的。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

我们使用 OpNet 的 app internals xpert 在我们的负载测试环境和生产环境中实时监控堆使用和泄漏。它足够轻巧,不会影响产品,因此我们获得了无法从 QA 获得的大量数据。我们还对两种环境中的方法和数据库调用进行分析,以帮助我们找出要优化的代码/sql。非常酷的东西,带有漂亮的趋势图表,但绝不是免费的。如果您在自己的应用上投入了大量资金,那么投资是值得的。

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

【讨论】:

【参考方案9】:

另一个免费的替代方法是使用Java-monitor。看看这个live demo。只需单击任何服务器即可查看有关堆内存、非堆内存、文件描述符、数据库池等的详细图表。

【讨论】:

以上是关于如何动态监控 Java 堆大小?的主要内容,如果未能解决你的问题,请参考以下文章

理解JAVA虚拟机(下)

性能测试之JVM监控

jconsole,jvisualvm监控jvm配置方法

如何使用JMX来管理程序?

监控每个线程的内存使用情况

我在哪里可以在 Windows pc 上永久设置 java 堆大小?