Java中一个线程占用多少内存?

15

在Java中,一个普通线程占用多少内存空间?假设它没有关联任何对象。


2
一个好的性能分析器可以帮助解决这个问题。 - Brady
2个回答

15

为线程栈分配的内存量是特定于您的JVM版本和操作系统的。它是通过-XX:ThreadStackSize选项(在较旧的版本中为-Xss)配置的。传闻512KB是“正常”的,尽管在64位Linux上为1024,这可能是它最常见的关键平台(至少一个人的观点)。


正如您所说,ThreadStackSize默认为512KB(32位),这个内存是在线程创建时预留的还是在方法调用嵌套时动态消耗的? - Ranger
它是保留的。这意味着某种程度上也与平台有关,但基本上,如果操作系统无法保证能够提供内存,则在创建线程时会发生OOM异常。(当然,能够提供内存可能包括将应用程序数据强制放入交换空间。)这与底层malloc操作的契约有关。当然,这也假定了具有本地绑定线程的现代JVM。在解释器中发生的情况是JVM的事情。 - Affe
1
还要记住,Linux 的用户线程上限与内存限制是独立的。Java 的“内存不足:无法创建本机线程”并不一定表示问题实际上是缺乏物理内存。 - Affe
Java在创建堆和线程时为虚拟内存保留最大大小,包括堆、线程栈等。当使用时才分配实际内存。在32位应用程序中,虚拟内存可能会很快耗尽,因为在某些操作系统上它可能只有1.5 GB左右。在64位应用程序中,虚拟内存可以达到48位,在许多平台上您只需要关注实际内存即可。 - Peter Lawrey

4

Java应用程序中的每个线程都有自己的堆栈。堆栈用于保存返回地址、函数/方法调用参数等等,而默认堆栈大小为512KB。您可以通过-Xss JVM命令进行更改。

java  -Xss128k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接