创建Java线程时的内存使用量

问题描述

| 实例化并启动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, 马丁