Java JVM内存与垃圾回收详解

需积分: 10 1 下载量 71 浏览量 更新于2024-07-14 收藏 14.25MB PDF 举报
"Java设计模式.pdf" 这篇文档主要介绍了Java虚拟机(JVM)的内存结构,垃圾回收机制以及相关的垃圾收集算法,并提及了不同类型的引用。以下是详细的知识点总结: 1. **JVM内存区域**: - **程序计数器**:每个线程都有自己的程序计数器,它存储了当前线程执行的字节码指令地址。 - **虚拟机栈**:同样线程私有,用于存储方法调用时的局部变量、操作数栈、动态链接等信息。 - **本地方法区**:线程私有,用于支持JNI(Java Native Interface)调用非Java代码。 - **堆**:线程共享,存放对象实例,是Java中最主要的内存区域。 - **方法区/永久代**:线程共享,存储类信息、常量、静态变量等。在Java 8中被元空间(Metaspace)替代。 2. **JVM运行时内存**: - **新生代**:包括Eden区、两个Survivor区(From和To)。对象首先在Eden区分配,经历Minor GC后,存活的对象会移动到Survivor区。 - **老年代**:存储生命周期较长的对象,使用标记整理算法进行垃圾回收。 - **永久代/元空间**:存储类信息,Java 8以后元空间代替了永久代,以减少对JVM内存的限制。 3. **垃圾回收与算法**: - **确定垃圾**:通过引用计数法或可达性分析来判断对象是否可被访问。 - **标记清除算法**:标记所有可达对象,然后清除不可达对象,留下连续空间。 - **复制算法**:将存活对象复制到一块连续内存区域,然后清空原区域。 - **标记整理算法**:标记后,将存活对象向一端移动,然后清理边界以外的区域。 - **分代收集算法**:根据对象生命周期,将堆分为新生代和老年代,使用不同的算法。 4. **JAVA四种引用类型**: - **强引用**:默认创建的对象引用,只要强引用存在,对象就不会被垃圾回收。 - **软引用**:当系统内存不足时,会回收软引用指向的对象。 - **弱引用**:任何时候只要发生垃圾回收,无论内存是否充足,都会回收弱引用指向的对象。 - **虚引用**:几乎无用的引用,仅用于跟踪对象是否被垃圾回收。 5. **GC分代收集算法与分区收集算法**: - 分代收集算法:针对不同生命周期的对象采用不同的垃圾回收策略,如新生代使用复制算法,老年代使用标记整理算法。 - 分区收集算法:将堆内存划分为多个小的连续区域,每个区域独立进行垃圾回收,提高并发性能。 6. **垃圾收集器**: - **Serial**:单线程,使用复制算法,适合小型应用。 - **ParNew**:Serial的多线程版本,通常配合CMS(Concurrent Mark Sweep)收集器使用。 - **ParallelScavenge**:多线程复制算法,注重系统的吞吐量。 - **SerialOld**:单线程的老年代收集器,使用标记整理算法。 这些内容对理解Java内存管理、垃圾回收机制和优化具有重要价值,有助于开发者写出更高效、资源友好的代码。