问题描述
|
实例化并启动Java线程时(大约)分配了多少内存?
这是一个代码示例:
// DeFinition of the thread class
class BasicThread extends Thread {
// This method is called when the thread runs
public void run() {
}
}
.
.
.
// Create and start the thread
Thread thread = new BasicThread();
thread.start();
解决方法
线程(即对象)本身需要一些空间-它确实有十几个变量和对象(而且我太懒了以至于无法正确地对它们进行计数),但它应该多于200byte(您\基本上必须计算所有的原语和引用(平凡的,它们具有固定的大小-但是引用取决于您的VM),然后计算该类分配的所有对象的大小[热点VM的开销为每个单词2个字对象(如果对象中没有局部变量,则为3,并在8字节边界上分配)]
真正占用空间的是线程本地堆栈,并且可能受到VM的-Xss标志的影响(尽管请注意,每个操作系统对最大堆栈空间都有一些限制,您可以在Linux中使用-ulimit来影响此限制,而在Windows中肯定可以通过某种方式来影响此限制以及)。
热点的默认值如下:
在Java SE 6中,Sparc的默认值为
在32位VM中为512k,在32k VM中为1024k
64位VM。在x86 Solaris / Linux上
在32位VM中为320k,在32位VM中为1024k
64位VM。
在Windows上,默认线程堆栈
从二进制文件读取大小
(java.exe)。从Java SE 6开始,
在32位VM中该值为320k
在64位VM中为1024k。
, IIRC,32位Windows为初始线程堆栈保留了64K的“真实”物理RAM。 Maybee内核可能会保留另一页的非分页内存,但是,基本上,唯一重要的初始保留是新线程的堆栈。如果此堆栈被炸毁,则虚拟内存管理器会将其增加到exe标头中读取的限制,并且通常在链接时设置。 IIRC,此限制不能降低到1MB以下。
不知道Linux-32的行为。大概有点类似。
Rgds,
马丁