Java内存管理总结
# Java 内存管理
# 栈内存(Stack Memory)
- 栈是线程私有的,每个线程都有自己的栈。
- 用于存储局部变量、方法参数、返回地址以及一些基本数据类型。
- 具有快速的分配和释放,因为采用"后进先出"(LIFO)的数据结构。
- 栈内存的大小是有限的,一般由虚拟机预先定义。
# 堆内存(Heap Memory):
- 用于存储对象实例和数组等动态分配的对象。
- Java 中的垃圾回收(Garbage Collection)发生在堆内存,回收不再使用的对象。
- 可以通过设置参数调整堆的大小,如 -Xmx(最大堆大小)和 -Xms(初始堆大小)。
- 堆内存分为新生代(Eden、Survivor)和老年代,不同的对象生成和生命周期影响对象在不同代中的分配。
# 方法区(Method Area)
- 存储类信息、常量、静态变量、方法代码等。
- 方法区也叫永久代(Permanent Generation),但在 Java 8 后被元空间(Metaspace)取代。
- 元空间的大小可以根据需要动态扩展,并且可以释放未使用的内存。
# 其他相关知识点
- 值传递与引用传递:基本类型采用值传递,传递的是值的拷贝;引用类型采用引用传递,传递的是引用的地址。
- 自动内存管理:Java 通过垃圾回收器自动管理内存,释放不再使用的对象,避免了手动释放内存的问题。
- 内存泄漏:未释放不再使用的对象,导致内存占用不断增加,最终可能耗尽可用内存。
- 内存溢出(Out of Memory):申请的内存超过了虚拟机的限制,导致程序崩溃。
- 弱引用、软引用和强引用:不同级别的引用可以影响垃圾回收时对象的生命周期。
- 栈帧(Stack Frame):方法在执行时会在栈上创建栈帧,用于存储局部变量、操作数栈、方法返回值等。
上次更新: 2024/9/25 11:16:13