区别
栈(Stack) | 堆(Heap) | |
---|---|---|
用途 | 用于执行方法,存放局部变量、对象的引用、数组的引用 | 用于存放对象和数组 |
速度 | 运行时会计算该方法需要分配多少内存空间,且遵循先进后出的压栈规则,因此灵活性低,但速度更快 | 空闲空间更大,运行时内存空间可随时申请或回收,因此灵活性高,但速度更慢 |
唯一性 | 每个Java线程都有一个栈 | 一个Java进程只有一个堆 |
举例
//基本变量
int a = 1;
//数组
int[] i = new int[]{1, 2, 3};
//对象
Person a = new Person();
a.name = "小明";
a.age = 10;
//引用传递
Person b = a;
在单一线程中执行以上函数,实际内存空间是这个样子:
可以看到栈内存只存放了局部变量,对于数组和对象,栈内存只持有引用,实际的值在堆内存里。
理解
- 栈内存(Stack):每个线程都有独立的栈,它结构紧凑,不灵活但是速度更快,并且Stack只有跟程序有关才翻译成“栈”,一般翻译成“一叠”或者“一摞”。因此它就像课桌上的一摞书,你(Thread1)的课桌上有,同桌(Thread2)的课桌上也有,叠成一摞之后放和拿都很快。
- 堆内存(Heap):空间由整个进程共享,它结构自由,空间更大,但速度更慢。所以它就像学校的杂物间,大得可以放下全校同学(整个进程)的物品,从里面找东西会比从一摞书中找书更慢,还不时会有保洁阿姨(gc)去清理垃圾。