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)才会标记它为可回收的对象,并在之后的某个时刻将其从堆内存中回收。
Spring防重复提交浅谈一下HashMap
Loading...
林明菁
林明菁
一个思念的人
公告

🎉欢迎你来到我的博客🎉

去右下角歌单里点首歌听吧
因为博客里没什么好看的

🔰版本号:NotionNext 4.8.3🔰