深入理解JVM:内存结构与垃圾回收

5星 · 超过95%的资源 需积分: 19 71 下载量 6 浏览量 更新于2024-07-17 1 收藏 10.59MB PDF 举报
"JAVA核心面试知识整理.pdf" 这篇文档涵盖了Java技术栈中的多个关键知识点,主要集中在JVM(Java虚拟机)以及相关的内存管理、垃圾回收机制、线程和数据库等方面。以下是这些知识点的详细说明: 1. **JVM内存区域**: - **程序计数器**:每个线程都有自己的程序计数器,用于存储当前线程执行的字节码指令地址。 - **虚拟机栈**:同样线程私有,存储每个方法的局部变量、操作数栈和方法返回信息。 - **本地方法区**:用于支持JNI(Java Native Interface)调用C/C++等本地方法。 - **堆**:所有线程共享,用于存储对象实例和数组,是Java中最大的内存区域。 - **方法区/永久代**:存储类信息、常量、静态变量等,Java 8后被元空间(Metaspace)替代。 2. **JVM运行时内存划分**: - **新生代**:包括Eden区、两个Survivor区(From和To),主要用于存放新创建的对象,进行Minor GC。 - **Minor GC**:新生代的垃圾回收,采用复制算法,将存活对象从Eden和一个Survivor区移动到另一个Survivor区。 - **老年代**:存放长期存活的对象,使用标记整理算法。 - **永久代/元空间**:存储类加载的信息,元空间是Java 8对永久代的改进,避免了Full GC时的性能问题。 3. **垃圾回收与算法**: - **确定垃圾**:通过引用计数法或可达性分析来判断对象是否可被回收。 - **标记清除**:标记所有存活对象,然后清除未标记的对象。 - **复制算法**:将存活对象复制到一块连续区域,然后清空原区域。 - **标记整理**:标记存活对象并整理到一端,清除另一端。 - **分代收集算法**:根据对象的生命周期将内存分为不同代,针对不同代使用不同的回收策略。 4. **Java四种引用类型**: - **强引用**:默认的引用类型,只要强引用存在,对象就不会被GC回收。 - **软引用**:在内存不足时会被回收,用于缓存等场景。 - **弱引用**:被弱引用关联的对象会在下一次GC时被回收。 - **虚引用**:用于跟踪对象在GC过程中的状态,不直接影响对象的生命周期。 5. **GC分代收集与分区收集**: - **分代收集**:根据对象生命周期特点,如新生代的复制算法和老年代的标记整理算法。 - **分区收集**:将堆内存划分为多个小区域,每区独立进行GC,减少停顿时间。 6. **垃圾收集器**: - **Serial**:单线程,适用于小内存应用,使用复制算法。 - **ParNew**:Serial的多线程版本,常与CMS配合使用。 - **ParallelScavenge**:多线程,优化响应时间和吞吐量,采用复制算法。 - **SerialOld**:单线程,用于老年代,使用标记整理算法。 这些内容是Java开发者面试中常见的考察点,理解和掌握这些知识对于优化应用程序性能和解决内存问题至关重要。