【并发篇】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):方法在执行时会在栈上创建栈帧,用于存储局部变量、操作数栈、方法返回值等。

你可能感兴趣的:(Java,java,jvm,八股)