java - 在运行时更新 java 线程的堆栈大小

标签 java multithreading memory stack-size

有谁知道是否有办法动态地(运行时)增加主线程的堆栈大小?此外,我相信这是同一个问题,是否可以在实例化后增加/更新 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/

相关文章:

java - Eclipse 不运行 Jboss standalone.conf

java - Android sql一次创建数据库

c++ - 增加计数器时避免竞争条件

memory - 24 位十六进制地址

c++ - 为什么分配更大的空间时,堆地址的增长方向会相反?

java - 另一台服务器上的 Spring Boot 外部配置

java - 如何为 listView 上的项目设置绝对位置?

multithreading - 最大并发线程数小于max-thread-pool-size

Java线程问题

python - 如何确定 Python 中对象的大小?