java 每个函数的栈空间大小是?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 每个函数的栈空间大小是?相关的知识,希望对你有一定的参考价值。

在Java程序运行时,各个栈空间大小如下:
  (1) 寄存器。最快的保存区域,位于处理器内部,数量十分有限,它是根据需要由编译器分配。我们对此没有直接的控制权.
  (2) 栈(stack)。驻留于常规RAM(随机访问存储器)区域,这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这失去了一定的灵活性,因此对象句柄是存放在栈中,但Java对象并不放到其中。
  (3) 堆(heap)。保存了Java对象。和栈不同,它最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
  (4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
  (5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
  (6) 非RAM存储。数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。
参考技术A 貌似在64位平台上,占8个字节,在32位平台上占4个字节 参考技术B 没有固定大小,不过你可以写个方法测试一下,大概估算出你代码中某个方法的栈大小。

先用-Xss设置下每个线程栈大小K,然后你无限递归你想要测试的方法,然后打印下当前调用的深度D,当JVM抛出StackOverflowError的时候,你看下打印出来的递归深度,然后用K/D大概可以估算出你这个方法的栈大小,仅仅是估算本回答被提问者和网友采纳
参考技术C 不清楚,呵呵 参考技术D 无法直接设置大小的,你放进去是多大~他就是多大~~没有具体大小,不知道楼主还有什么要问的追问

如果没有大小为何会有有栈溢出的说法!

请问 怎样分别查看windows系统与Linux系统的栈空间大小?

linux和windows下同样的文件或文件夹的大小有什么区别1.window下文件夹不算大小,linux下文件夹要算大小2.两个系统下的文件系统可能不一样,不同的文件系统,blocksize可能不一样。blocksize不一样,文件占用的磁盘空间可能就不一样。不同操作系统下查看blocksize的命令:AIX:lsfs -q /u01 Windows:fsutil fsinfo ntfsinfo c:linux:tune2fs -l /dev/sda1 3.window和linux下,文本文件的换行符不同,windows下是/n/r,linux下是/n。当使用FTP传输文本文件时,默认会进行换行符的转换,造成传输前后文件大小不一致。4.要确认看到的文件大小是指文件本身的大小,还是文件占用的磁盘空间的大小,两者概念不同。 参考技术A linux 下:
终端输入命令:ulimit -a
这一行就是,大概8M:stack size (kbytes, -s) 8192
windows下:
好像没有命令可以查看,但是可以通过递归调用函数,使其溢出来查看栈大小:
#include <stdio.h>
void fun()

int a;
printf("%p\n",&a);
fun();

int main(void)

fun();
return 0;

首先,在fun()函数中的fun();处,打个断点,得到a的地址:00CFFD60
然后,去掉断点,运行,直到栈溢出,致使程序崩溃,得到最后一个a的地址:00C07020
两个地址相减,即为栈的大小:约为 :1M

以上是关于java 每个函数的栈空间大小是?的主要内容,如果未能解决你的问题,请参考以下文章

请问 怎样分别查看windows系统与Linux系统的栈空间大小?

函数的栈空间,极速调用之内联函数

函数的栈空间,极速调用之内联函数

JAVA线程问题

Java堆和栈的区别和介绍,JVM的堆和栈

关于java虚拟机