运行一段时间后,可以获得Java中线程使用的实际堆栈大小吗?

运行一段时间后,可以获得Java中线程使用的实际堆栈大小吗?,java,stack-size,Java,Stack Size,其想法是帮助确定给定Java应用程序的最佳堆栈大小 利用这些信息可以做的一件事是创建一个堆栈大小的范围表,线程可以在退出时对其进行修改,并且可以在应用程序退出时定期转储 编辑:这是在客户机器上运行的情况下,实际工作负载是我无法访问profiler的。 EDIT2:作为对一个答案的回应,在(IIRC)256Kb/线程的情况下,我想知道这与实际需要有多接近(我还想知道这个问题是否不是很相关,因为堆栈空间可能是按需分配的)。我们有一个基于消息传递和高度线程化的应用服务器,它运行在从ARM手持设备到oc

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

利用这些信息可以做的一件事是创建一个堆栈大小的范围表,线程可以在退出时对其进行修改,并且可以在应用程序退出时定期转储

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

EDIT2:作为对一个答案的回应,在(IIRC)256Kb/线程的情况下,我想知道这与实际需要有多接近(我还想知道这个问题是否不是很相关,因为堆栈空间可能是按需分配的)。我们有一个基于消息传递和高度线程化的应用服务器,它运行在从ARM手持设备到octo core Linux,再到中端和大型机的所有设备上——如果我们能够在具有许多消息处理程序的系统上用堆栈空间换取堆,这将是一件好事

有一些类似的问题值得关注,但它们是特定于本机/操作系统的:

使用JConsole——您可能已经拥有了它:
堆栈内存将很难获得


您所能做的最好的,并且非常容易的,就是通过使用JVM内存使用。

我认为您也可以使用全新的JVM来做到这一点。

您可以像这样使用Runtime类来监视JVM内存

Runtime rt = Runtime.getRuntime();
System.out.println((rt.freeMemory() / 1024) + "/" + (rt.maxMemory() / 1024) + " kB");
或者您可以使用JConsole、JVisualVM e JInfo。 您可以获得有关这些工具的更多信息


给自己买一个64位平台…@Tom:当然。。。我会给我的每个客户买一个,外加8 Gig的RAM,这样我就不用考虑我设计和编写的软件了。我已经考虑过了(实际上JVisualVM更好),我用的是JProfiler。。。但这是在客户机器上运行的情况下,我无法获得profiler访问的真实工作负载,我使用JProfiler…但这是在客户机器上运行的环境下,我无法获得profiler访问的真实工作负载。”有趣的是,JVisualVM与Java 6捆绑在一起,我不知道它也通过web分发。插件看起来非常有用。这并没有告诉我们堆栈的大小。这样你只能得到JVM实例的内存使用情况,或者它也只能得到当前线程的内存使用情况?