Java面试必备:JVM内存与垃圾回收深度解析

版权申诉
5星 · 超过95%的资源 21 下载量 24 浏览量 更新于2024-06-24 10 收藏 10.08MB PDF 举报
"这是一份由字节跳动的大佬精心整理的Java面试复习资料,总计283页,涵盖了Java面试中常见的知识点,特别是关于JVM的深入理解。" 在Java面试中,JVM(Java虚拟机)是不可或缺的重要话题。这份资料详细介绍了JVM的各个方面: 1. **JVM内存区域**: - **程序计数器**:每个线程都有一个独立的程序计数器,用于存储当前线程正在执行的字节码指令地址。 - **虚拟机栈**:同样线程私有,每个方法对应一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。 - **本地方法区**:为Java Native Interface (JNI) 方法提供服务,存放C/C++的本地方法栈。 - **堆**:所有线程共享,用于存储对象实例和数组,进行对象分配和垃圾回收。 - **方法区/永久代**:存储类的信息,如类的加载器、常量池、字段和方法数据等。在Java 8后被元空间取代。 2. **JVM运行时内存细分**: - **新生代**:对象首先在Eden区创建,经历几次Minor GC后存活的对象会被转移到Survivor区。 - **Eden区**:大多数对象的出生地。 - **SurvivorFrom/ServivorTo**:两个Survivor区交替使用,用于存储经历过Minor GC的对象。 - **老年代**:存放长期存活的对象,通常使用标记整理或复制算法进行垃圾回收。 - **永久代/元空间**:存储类的元数据,Java 8之后,这部分移到了堆外的元空间。 3. **垃圾回收与算法**: - **确定垃圾的方法**:包括引用计数法和可达性分析。 - **垃圾回收算法**: - **标记清除**:标记无用对象并清除,导致内存碎片。 - **复制算法**:将存活对象复制到一块连续区域,简单高效但浪费空间。 - **标记整理**:标记后整理存活对象,避免碎片,适用于老年代。 - **分代收集**:根据对象生命周期不同,采用不同算法,如新生代使用复制,老年代用标记整理。 4. **Java四种引用类型**: - **强引用**:默认的引用类型,只要强引用存在,对象就不会被GC回收。 - **软引用**:在系统即将发生OOM时,会回收软引用关联的对象。 - **弱引用**:GC周期性检查,无论是否内存充足,都会回收弱引用对象。 - **虚引用**:最弱的一种引用,对象能否生存与虚引用无关,仅用于跟踪对象被GC回收的事件。 5. **GC分代收集与分区收集**: - **分代收集**:根据对象存活周期,将堆分为新生代和老年代,分别应用不同的算法。 - **分区收集**:将堆细分为多个大小固定的区域,提高GC效率。 6. **GC垃圾收集器**: - **Serial**:单线程的收集器,适用于小型应用,使用复制算法。 - **ParNew**:Serial的多线程版本,常与CMS配合使用。 - **ParallelScavenge**:多线程,关注系统的吞吐量,使用复制算法。 - **SerialOld**:Serial的旧年代版本,使用标记整理算法。 这份资料详细解析了JVM的工作原理,对于Java开发者来说,理解和掌握这些内容对于面试和优化应用程序性能都至关重要。通过深入学习,可以提升解决性能问题的能力,并在面试中展现出对Java平台的深度理解。