java程序运行后,jvm会有一个堆内存,也可以叫做主空间,线程会有一个栈内存,也可以叫做工作空间。
这两个空间各自主要存放什么?为什么有了堆又有栈?
咱们首先看看下面的代码:
int[] arr ;//执行图1
arr = new int[3];//执行图2
for(int i=0;i<a.length;i++)
arr[i] = i+5;//执行图三上面的代码在堆和栈中是如何分配空间的呢?请看下面三张图
图1:
int[] arr
图2 :
arr = new int[3];
图3:
通过以上的代码和图分析分析: arr是引用变量,存放于栈内,
实际的数组元素存放在堆里,如果想访问堆内的数组元素,程序只能通过arr[下标]来去访问,也就是只能通过栈里的变量访问其所指向的堆内的元素。
我们前面说了栈是属于线程的空间,当此线程执行完,那么这个栈也就销毁了,而堆里的不会消失,但假使堆里这个对象没有任何栈的引用指向它,那么我们传说的JVM就会在合适的时机把他当垃圾一样回收。
这样说,你懂得为什么要有堆还有栈了吧?什么?还是不懂?
简单的说就是创建一个对象需要的成本很高,我们把他放在堆里,栈的变量可以对此对象多次利用(因为可以有多个变量指向同一个对象),那么就大大提高了效率啊
转载请注明原文地址: https://ju.6miu.com/read-37166.html