1 栈内存
1 栈内存用来存放基本类型的变量和对象的引用变量;
2 当定义一个变量,Java就在栈中为该变量分配存储空间;
3 当程序运行超过该变量的作用域,Java就会自动释放掉为该变量分配的内存空间。
2 堆内存
1 堆内存用来存放由new创建的对象;
2 在堆中创建一个对象后,还必须在栈中定义一个特殊的变量,其取值等于对象在堆内存中的首地址,这个变量称作对象的引用变量;
3 以后就可以在程序中使用栈内存中的引用变量来访问堆内存中的对象;
4 引用变量相当于对象的一个别名。
3 关于内存释放的问题
1 引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放;
2 而对象本身在堆中分配,即使程序运行到使用new产生对象的语句所在地代码块之外,对象本身占用的堆内存也不会被释放,对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因;
3 栈中的变量指向堆内存中的变量,就是 Java 中的指针。