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

Pac*_*ier 6 java stack

我知道在运行时没有办法在Java中获取线程的堆栈大小(参见可以在运行一段时间后获得Java中线程使用的实际堆栈大小吗?).

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

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

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

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

ams*_*ams 3

堆栈上存储的唯一内容是原始类型和引用。对象总是在堆上创建,因此存储在堆栈上的数据类型是

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

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

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

不给出堆栈大小的另一个原因是,这将是一个您无法真正执行任何操作的实现细节,创建线程后您无法更改线程堆栈的大小,而且您也不能这样做指针算术那么知道堆栈大小有什么意义呢?