一、什么是堆,它和栈有什么区别?
1、变量和堆的关系
package heap; public class Test01 { public static void test() { int j = 100; } public static void main(String[] args) { int i = 10; test(); } }
以上代码的执行顺序:
(1)main方法,java虚拟机栈开辟了一个栈帧,存放变量int i = 10
(2)执行到test方法时,java虚拟机栈新开辟一个栈帧,存放变量int j = 100
(3)test方法执行完后,test栈帧被回收(后进先出),但是main栈帧没执行完就没回收
方法的变量和堆没有关系,存储在栈帧里
2、数组和堆的关系
package heap; public class Test02 { public static void main(String[] args) { int[] x = new int[5]; x[0] = 100; x = null; } }
以上代码的执行顺序:
(1)执行main方法,java虚拟机栈开辟了一个栈帧。
当执行int[] x = new int[5]时,栈开辟了x变量空间,该变量存放的是堆的引用地址。
堆开辟了x数组空间,例如0x0001,存放数组的值。数组的元素都设置默认值0.
栈里的x存放的是堆的引用地址,例如x = 0x0001。
(2)执行x[0]=100时,
堆会为x[0]=100,栈的x变量不会变,继续引用堆的地址。
(3)当执行x=null时,x引用的内存地址被删除,例如栈帧删除了0x0001。而堆中的数组不再被x使用后,就会变成垃圾,堆不会立即删除,它是采用垃圾回收算法删除。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)