为什么没有方法来获得堆栈的实际大小?

时间:2012-02-11 20:58:47

标签: java stack

据我所知,在运行时无法在Java中获取线程的堆栈大小(请参阅Can one obtain actual stack size used by a thread in Java after some time of running?)。

例如,如果我们创建一个java.lang.Thread指定堆栈大小为64 * 1024,则JVM可以自由地为我们提供一个任何堆栈大小的线程。

但是,我相信实际知道堆栈的实际大小对于需要此类信息的某些应用程序非常有用。

我们没有方法告诉我们用于堆栈的实际字节数是什么原因?

架构中是否存在某种限制,导致无法获得线程的实际字节数?

1 个答案:

答案 0 :(得分:3)

存储在堆栈中的唯一内容是基本类型和引用。始终在堆上创建对象,因此将存储在堆栈中的数据类型为

  • 类型为byte,char,int,long,float,double的局部变量,其中最长的是double,即8个字节
  • 对象的引用是32位vm上的4个字节,64位vms上的8个字节(可能更短,48位引用用于节省空间)

请注意,数组是对象类型,因此它们存储在堆上,如果您的基元是类中的字段,则基元是对象的一部分,因此将存储在堆上。

除非你有跑道递归,否则很难用完一个线程的堆栈空间。我想这就是Java设计师没有给你一种方法来找出堆栈大小的原因。

不给出堆栈大小的另一个原因是它是一个实际的细节,你无法真正做任何事情,你不能在创建线程后改变线程堆栈的大小,你可以做指针算术那么知道堆栈大小的重点是什么?