【发布时间】:2011-01-10 22:01:11
【问题描述】:
我正在尝试动态监控 java 堆大小。有谁知道如何获得在运行一段代码的过程中使用的最大内存? Runtime.maxMemory() 能解决问题吗?谢谢
【问题讨论】:
标签: java heap-memory monitoring
我正在尝试动态监控 java 堆大小。有谁知道如何获得在运行一段代码的过程中使用的最大内存? Runtime.maxMemory() 能解决问题吗?谢谢
【问题讨论】:
标签: java heap-memory monitoring
maxMemory() 返回 java 将使用的最大内存量。所以这不会让你得到你想要的。 totalMemory() 是您正在寻找的东西。见docs
【讨论】:
jstat -gc <pid> <time> <amount>
jstat -gc `jps -l | grep weblogic\.Server | awk {'print $1'}` 1000 3
3 个样本 1 一秒 see more here
【讨论】:
如果您愿意,您可以直观地查看使用 JConsole 分析您的应用程序的许多值。
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jconsole.html
开始您的应用程序:
-Dcom.sun.management.jmxremote
当您启动 /bin/jconsole.exe 时,您的应用程序将可供选择
【讨论】:
我还想补充一点,jmap -heap <PID> 可以解决问题;那是假设您是一名运维人员并且需要知道 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 的 app internals xpert 在我们的负载测试环境和生产环境中实时监控堆使用和泄漏。它足够轻巧,不会影响产品,因此我们获得了无法从 QA 获得的大量数据。我们还对两种环境中的方法和数据库调用进行分析,以帮助我们找出要优化的代码/sql。非常酷的东西,带有漂亮的趋势图表,但绝不是免费的。如果您在自己的应用上投入了大量资金,那么投资是值得的。
http://www.opnet.com/solutions/application_performance/appinternals-xpert.html
【讨论】:
另一个免费的替代方法是使用Java-monitor。看看这个live demo。只需单击任何服务器即可查看有关堆内存、非堆内存、文件描述符、数据库池等的详细图表。
【讨论】: