5

有谁知道是否有办法动态(运行时)增加主线程的堆栈大小?另外,我相信这是同一个问题,是否可以Thread在实例化后增加/更新 a 的堆栈大小?

Thread的 CTOR 允许定义其堆栈大小,但我找不到任何更新它的方法。实际上,我在JDK中没有发现任何堆栈大小的管理(这往往表明这是不可能的),一切都在VM中完成。

根据java 语言规范,可以在“创建堆栈时”设置堆栈大小,但有一个注释:

Java 虚拟机实现可以为程序员或用户提供对 Java 虚拟机堆栈的初始大小的控制,以及在动态扩展或收缩 Java 虚拟机堆栈的情况下,对最大和最小大小的控制。

IMO 不是很清楚,这是否意味着某些 VM 处理具有最大(编辑)堆栈大小的线程在给定范围内演变?我们可以用 Hostpot 做到这一点吗(我在 Xss 旁边没有找到任何与堆栈大小相关的选项)?

谢谢 !

4

2 回答 2

5

堆栈大小在使用时会动态更新,因此您永远不需要这样做。

您可以设置的是它可以使用的最大大小-Xss这是使用的虚拟内存大小,您可以在 64 位 JVM 上将其设置为任意大小。实际使用的内存取决于您使用的内存量。;)

编辑:重要的区别是最大大小被保留为虚拟内存(堆也是如此)。即地址空间是保留的,这也是不能扩展的原因。在 32 位系统中,地址空间有限,这仍然是个问题。但在 64 位系统中,您通常拥有高达 256 TB 的虚拟内存(处理器限制),因此虚拟内存很便宜。实际内存以页为单位分配(通常为 4 KB),并且仅在使用时分配。这就是为什么即使在启动时分配了最大堆大小,Java 应用程序的内存也会随着时间的推移而增长。线程堆栈也会发生同样的事情。仅分配实际接触的页面。

于 2012-04-13T08:35:02.173 回答
3

在标准 JDK 中没有办法做到这一点,甚至stackSize争论也不是一成不变的:

stackSize 参数的影响(如果有)高度依赖于平台。...在某些平台上,stackSize 参数的值可能没有任何影响。...虚拟机可以自由地将stackSize参数视为建议。

(重点是原文。)

于 2012-04-13T06:54:29.390 回答