堆栈:函数的参数值,局部变量等,自动清除!
堆:静态变量和成员变量,new得到的变量,都存放在堆中! 局部变量à栈中; 方法参数à栈中; 引用变量à栈中; 常量à栈中; 静态变量à堆中(常量池àJVM运行时首先为其开辟空间,位置不变,程序运行结束时空间释放); 静态方法à堆中(静态存储à JVM运行时首先为其开辟空间,位置不变,程序运行结束时空间释放); 成员方法ànew的时候存储在堆中; 成员变量ànew的时候存储在堆中; 非new的字符串存放在JVM的地址池中,地址池也是位于栈中!
栈:位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其中。
堆:一种通用性的内存池(也存在于RAM中),用于存放所有的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。 |