如何动态监控 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 <PID>
可以解决问题;那是假设您是一名运维人员并且需要知道 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 堆大小?的主要内容,如果未能解决你的问题,请参考以下文章