heap 和 stack 的区别
heap(堆)空间是手动申请和释放的
参数 | stack(栈) | heap(堆) |
---|---|---|
JVM | 内存指令区 | 内存数据区 |
速度 | 快 | 慢 |
存放内容 | 基本数据类型、变量名、常量 | 对象 |
顺序 | 先进后出 | 先进先出 |
空间 | 小 | 大 |
- Heap是 Stack的一个子集.------扩展—>从内存观点考虑。
- Stack存取速度仅次于寄存器,存储效率比heap高,可共享存储数据,但是其中数据的大小和生存期必须在运行前确定。
- Heap是运行时可动态分配的数据区,从速度看比Stack慢,Heap里面的数据不共享,大小和生存期都可以在运行时再确定。
- new关键字 是运行时在Heap里面创建对象,每new一次都一定会创建新对象,因为堆数据不共享。
参考自 Java中Heap与Stack的区别
个人简单理解,常量、临时变量、方法名存放在stack(栈)中,使用类似Map方式存放,存放变量名和对应的在heap(堆)中的地址,两者都处于计算机运行内存中。
当我们复制的时候:
@Data
public class Hero{
private String name;
}
public void copy(){
Hero A = new Hero();
A.setName("小黑");
/*此时stack(栈)中存放A这个对象名称,实际数据保存在heap(堆)中,
* 栈中的 A 指向 堆 中的物理地址
* */
Hero B = A;
/* 当我们想进行复制时,此时复制的只是栈中A存放的物理地址,
* 也就是说B和A指向的是同一个堆中的地址,当我们修改A的值时,B也会被修改
* 我们需要B和A不同的时候,就需要
* */
Hero B = new Hero();
/* 重新给B分配一个heap(堆)中的地址,然后将A中的值set到B中,
* 还有其他对象的复制方式,我这边只是举个例子
* */
}