目录
- 1- 引言:堆
- 1-1 堆是什么?(What)
- 1-2 为什么用堆?堆的作用 (Why)
- 2- ⭐核心:堆的原理(How)
- 2-1 堆的划分
- 2-2 Java 7 与 Java 8 的堆区别
- 3- 小结:
- 3-1 详细介绍下Java的堆?
- 3-2 JVM 中的堆是如何划分的?
- 3-3 Java 7 与 Java 8 的堆区别?
1- 引言:堆
1-1 堆是什么?(What)
- 堆是线程共享的区域: 主要用来保存 对象实例 ,数组 等,当堆中没 等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出 OutOfMemory异常。
1-2 为什么用堆?堆的作用 (Why)
- 1. 存储对象实例和数组:堆主要用于存储对象实例和数组,这些对象实例和数组可以在程序运行时动态分配内存。
- 2. 支持垃圾回收:堆内存的管理支持垃圾回收机制,自动释放不再使用的对象,从而提高内存使用效率,减少内存泄漏风险。
- 3. 线程共享:堆是所有线程共享的内存区域,使得对象可以在不同线程之间共享和传递,支持多线程编程。
- 4. 灵活性和扩展性:堆内存可以根据程序运行时的需求动态扩展,适应不同应用的内存需求,避免因静态分配导致的内存浪费或不足。
- 5. 方法区(元空间)的支持:堆包含方法区(在Java 8中为元空间),存储类信息、静态变量、常量池和编译后的代码,有助于类加载和运行时动态特性。
- 6. 生命周期管理:通过年轻代和老年代的划分,堆能够有效管理对象的生命周期,提高垃圾回收的效率。
2- ⭐核心:堆的原理(How)
2-1 堆的划分
- 堆总体上分为 年轻代 和 老年代
- 年轻代中堆又分为了 3 部分:Eden 区和两个大小严格相同的 Survivor 区,根据 JVM 的策略,在经过几次垃圾收集后,任然存活于 Survivor 的对象被移动到老年代区。
- 老年代:主要保存生命周期长的对象,一般是一些老的对象。
- 元空间:保存类的信息、静态变量、常量、编译后的代码。
2-2 Java 7 与 Java 8 的堆区别
- 方法区与元空间的变化:
- Java 7:堆中包含一个叫做 方法区(也称为永久代),用于存储类信息、静态变量、常量和编译后的代码。
- Java 8:方法区(Method Area)的概念依然存在,但它的实现方式发生了变化。永久代(PermGen)被移除,替换为元空间(Metaspace),元空间使用本地内存来存储类的元数据。
- 内存管理优化:
- Java 7:永久代 的大小是固定的,需要手动调整,容易因设置不当导致内存溢出(
OutOfMemoryError
,OOM
)。 - Java 8:元空间 动态扩展,减少了内存溢出的风险。将元空间放入本地内存中,使堆的空间更大,更灵活。