type
status
date
slug
summary
tags
category
icon
password
栈和堆
栈和堆是 Java 内存管理中的两个重要概念,它们分别用来管理不同类型的数据和对象。它们在内存中占据不同的位置,有不同的管理方式,并在程序执行时扮演着各自的角色。
1 栈 (Stack)
栈内存是一个连续的内存区域,主要用于存储局部变量和方法调用的相关信息(如方法的参数、返回值等)。它遵循 " 先进后出 "(LIFO,Last In, First Out)的原则。当一个线程被创建时,就会为它分配一个栈空间,每当一个方法被调用,相关的 局部变量和方法信息 都会被压入 当前线程的栈中;当方法执行完毕,栈帧就会被销毁,局部变量随之消失,避免了手动管理内存的麻烦。
- 每个线程都有自己的栈空间,独立于其他线程。
- 栈空间由操作系统管理,不需要手动分配或释放内存。
- 栈内存的分配和回收非常高效,因为它只需要简单的指针操作。
2 堆 (Heap)
堆是 JVM 用来存储对象实例的内存区域。所有通过
new
关键字创建的对象都存储在堆中。堆是一个动态分配的内存区域,管理起来比较复杂,不像栈那样有固定的分配方式。堆中的对象可以在多个方法之间共享,因此它的生命周期更长。
堆为对象的创建和管理提供了灵活的空间,支持 动态分配内存。由于对象的生命周期可能超出方法的调用周期,所以它们不能像栈中的局部变量那样直接销毁。
- 堆中的对象通过垃圾回收(GC)来管理,不需要开发者手动管理内存。
- 对象在堆中分配的内存是动态的,需要操作系统进行内存分配和回收。
- 堆内存的管理相对复杂,且比栈内存的分配和回收要慢。
3 例子
在上面的例子中,
person
对象存储在堆内存中,而 person
变量本身存储在栈中,指向对象所在的堆内存地址。exampleAge
变量就存在当前线程的栈中,当这个 exampleMethod()
方法执行完毕后就会立即销毁。但堆中的 person
对象并不会立即被销毁,只有当该对象不再被任何活动的引用所引用时 (关于 Java 中的两种引用),垃圾回收器(GC)才会标记它为可回收的对象,并在之后的某个时刻将其从堆内存中回收。- 作者:林明菁
- 链接:https://blog.lxuan.fun/article/StackAndHeap
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。