有没有人知道是否有办法动态(运行时)增加主线程的堆栈大小?另外,我认为这是同一个问题,是否有可能在实例化后增加/更新Thread
的堆栈大小?
Thread
的CTOR允许定义其堆栈大小,但我找不到任何更新它的方法。实际上,我没有在JDK中找到任何堆栈大小的管理(这往往表明它不可能),一切都在VM中完成。
根据java language specification,可以在创建堆栈时设置堆栈大小,但有一个注释:
Java虚拟机实现可以为程序员或用户提供对Java虚拟机堆栈初始大小的控制,以及在动态扩展或收缩Java虚拟机堆栈的情况下,控制超过最大和最小尺寸。
IMO不是很清楚,这是否意味着某些VM处理的线程的最大(编辑)堆栈大小在给定范围内发展?我们可以用Hostpot做到这一点(我没有在Xss旁边找到任何与堆栈大小相关的选项)?
谢谢!
答案 0 :(得分:4)
堆栈大小在使用时会动态更新,因此您无需这样做。
您可以设置的最大大小是-Xss
这是使用的虚拟内存大小,您可以在64位JVM上使其大小。使用的实际内存基于您使用的内存量。 ;)
编辑:重要的区别是最大大小被保留为虚拟内存(堆btw也是如此)。即地址空间被保留,这也是它无法扩展的原因。在32位系统中,您的地址空间有限,这仍然是个问题。但在64位系统中,您通常拥有高达256 TB的虚拟内存(处理器限制),因此虚拟内存很便宜。实际内存以页面(通常为4 KB)分配,并且仅在使用时分配。这就是为什么Java应用程序的内存似乎随着时间的推移而增长,即使在启动时分配了最大堆大小。线程堆栈也会发生同样的事情。仅分配实际触摸的页面。
答案 1 :(得分:3)
在标准的JDK中没有办法做到这一点,甚至stackSize
参数也没有一成不变:
stackSize参数的效果(如果有)与平台高度相关。 ... 在某些平台上,stackSize参数的值可能没有任何影响。 ...虚拟机可以自由地将stackSize参数视为建议。
(original中的重点。)