Java中是否可以在线程运行一段时间后获取实际使用的堆栈大小?

13

这个想法是帮助确定给定Java应用程序的最佳堆栈大小。

可以使用这些信息中的一个来创建堆栈大小范围表,线程在退出时可以修改该表单,可以定期转储以及在应用程序退出时进行转储。

编辑:这是在客户机上运行实际工作负载的情况下,我无法获得分析器访问权限。

编辑2:回答中的一个问题,每个线程大约需要256Kb的堆栈空间,我一直在想真正需要多少(我也在想这个问题可能不太相关,因为或许会按需分配堆栈空间)。我们有一个基于消息传递和高度线程化的应用服务器,可在从ARM手持设备到八核Linux再到中端和大型机器上运行 - 很好地了解在具有许多消息处理程序的系统上我们可以在哪里(以及是否)可以将堆栈空间与堆进行转换。

有一些类似的问题很有意思,但它们是本地/操作系统特定的:


1
只需获取一个64位平台... - Tom Hawtin - tackline
9
@Tom: 当然...我将为每位客户购买一台,并配备8GB内存,这样我就不必考虑我设计和编写的软件了。 - Lawrence Dol
4个回答

1

获取堆栈内存可能会很困难。

您能够轻松地通过MemoryMXBean获取JVM内存使用情况。


-1

1
我曾经考虑过这个问题(实际上JVisualVM更好),我使用JProfiler...但是这是在客户机器上运行真实工作负载的情况下,我无法获得分析器访问权限。 - Lawrence Dol

-1

我认为你也可以使用全新的VisualVM来完成这个任务。


根据我在5月5日对Cuga答案的评论:“我已经考虑过了(实际上JVisualVM更好),我使用JProfiler...但这是在运行在客户机器上并且有真实工作负载的情况下,我无法获得分析器访问权限。” - Lawrence Dol
有趣的是,JVisualVM与Java 6捆绑在一起 - 我不知道它也可以通过网络分发。插件看起来非常有用。 - Lawrence Dol

-3

您可以使用Runtime类来监视JVM内存,如下所示。

Runtime rt = Runtime.getRuntime();
System.out.println((rt.freeMemory() / 1024) + "/" + (rt.maxMemory() / 1024) + " kB");

或者您可以使用JConsole、JVisualVM和JInfo等工具。您可以在这里获取有关这些工具的更多信息。

http://java.sun.com/developer/technicalArticles/J2SE/monitoring/


2
那并没有告诉我们堆栈大小。 - devoured elysium
这样做,您只能获得JVM实例的内存使用情况,还是也可以仅获取当前线程的内存使用情况? - Eldius

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