我正在尝试动态监视java堆大小。有人知道如何在运行一段代码的过程中获得最大内存吗? Runtime.maxMemory()可以解决这个问题吗?感谢
答案 0 :(得分:28)
maxMemory()
返回java将使用的最大内存量。所以那不会得到你想要的东西。 totalMemory()
正是您所寻找的。请参阅docs
答案 1 :(得分:13)
答案 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。只需单击任何服务器即可查看堆内存,非堆内存,文件描述符,数据库池等详细信息。