有谁知道是否有办法动态地(运行时)增加主线程的堆栈大小?此外,我相信这是同一个问题,是否可以在实例化后增加/更新 Thread
的堆栈大小?
Thread
的 CTOR 允许定义其堆栈大小,但我找不到任何方法来更新它。实际上,我在JDK中并没有发现任何关于堆栈大小的管理(这往往表明这是不可能的),一切都在VM中完成。
根据java language specification可以在“创建堆栈时”设置堆栈大小,但有一个注意事项:
Java 虚拟机实现可以让程序员或用户控制 Java 虚拟机堆栈的初始大小,以及在动态扩展或收缩 Java 虚拟机堆栈的情况下,控制超过最大和最小尺寸。
IMO 这不是很清楚,这是否意味着某些 VM 处理具有最大(编辑) 堆栈大小在给定范围内变化的线程?我们可以用 Hostpot 做到这一点吗(除了 Xss,我没有找到任何与堆栈大小相关的选项)?
谢谢!
最佳答案
堆栈大小会在使用时动态更新自身,因此您永远不需要这样做。
您可以设置的最大大小是 -Xss
这是使用的虚拟内存大小,您可以在 64 位 JVM 上将其设置为任意大小。实际使用的内存取决于您使用的内存量。 ;)
编辑:重要的区别是最大大小被保留为虚拟内存(顺便说一句,堆也是如此)。即地址空间是保留的,这也是它不能扩展的原因。在 32 位系统中,地址空间有限,这仍然是个问题。但在 64 位系统中,您通常拥有高达 256 TB 的虚拟内存(处理器限制),因此虚拟内存很便宜。实际内存以页面(通常为 4 KB)为单位分配,并且仅在使用时分配。这就是为什么 Java 应用程序的内存似乎会随着时间的推移而增长,即使在启动时分配了最大堆大小。线程堆栈也会发生同样的事情。只分配实际接触的页面。
关于java - 在运行时更新 java 线程的堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10136281/