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

需积分: 50 18 下载量 85 浏览量 更新于2024-07-09 收藏 10.59MB PDF 举报
"这份资料是2020年的Java面试题及答案,涵盖了JVM相关的详细知识,包括JVM内存区域、垃圾回收机制以及各种垃圾回收算法,还涉及了Java的四种引用类型和不同的垃圾收集器。" 在Java面试中,JVM(Java虚拟机)的相关知识通常是必考的重点。本资料详细讲解了JVM的结构和工作原理,从以下几个方面进行了深入探讨: 1. JVM内存区域: - **程序计数器**:每个线程都有自己独立的程序计数器,用于存储当前线程正在执行的字节码指令地址。 - **虚拟机栈**:同样为线程私有,每个线程都有自己的虚拟机栈,用于存放栈帧,每个栈帧对应一个方法调用。 - **本地方法区**:为Java Native Interface (JNI) 提供服务,线程私有,存储非Java语言的方法调用。 - **堆**:线程共享,存放对象实例,是Java内存管理的主要区域,分为新生代和老年代。 - **方法区/永久代**:线程共享,存储类的信息、常量、静态变量等,Java 8后被元空间(Metaspace)取代。 2. JVM运行时内存: - **新生代**:包括Eden区、两个Survivor区(From和To),用于存放新创建的对象,进行Minor GC。 - **Eden区**:大多数对象首先被分配到Eden区。 - **Survivor区**:在每次Minor GC时,存活的对象会从Eden和From区复制到To区,然后清空Eden和From区,To区满则晋升到老年代。 - **老年代**:存放长期存活的对象,执行Major GC。 - **永久代/元空间**:存储类的元数据,如类的定义、方法信息等。 3. 垃圾回收与算法: - **如何确定垃圾**:通过引用计数法和可达性分析来判断对象是否可达,从而决定是否为垃圾。 - **标记清除算法**:标记所有存活对象,然后清除死亡对象,产生碎片。 - **复制算法**:将存活对象复制到一块连续区域,避免碎片,但浪费了一半空间。 - **标记整理算法**:标记存活对象后,整体移动,消除碎片,适用于老年代。 - **分代收集算法**:根据对象生命周期特性,针对不同年代使用不同算法,如新生代用复制算法,老年代用标记整理算法。 4. Java的四种引用类型: - **强引用**:默认的引用类型,只要强引用存在,对象就不会被GC回收。 - **软引用**:在系统将要发生内存溢出之前,会回收软引用指向的对象。 - **弱引用**:任何时候只要GC运行,无论内存是否足够,都会回收弱引用指向的对象。 - **虚引用**:虚引用主要用于跟踪对象被垃圾收集的状态,无法通过虚引用来访问对象。 5. GC分代收集算法与分区收集算法: - **分代收集算法**:根据对象生命周期不同,将堆分为新生代和老年代,使用不同的GC策略。 - **分区收集算法**:将堆空间进一步细分,提高垃圾收集效率。 6. 垃圾收集器: - **Serial**:单线程的垃圾收集器,使用复制算法,适用于小型应用。 - **ParNew**:Serial的多线程版本,常与CMS配合使用。 - **ParallelScavenge**:多线程,优化新生代,目标是达到更稳定的吞吐量。 - **SerialOld**:Serial的老年代版本,使用标记整理算法。 这份资料全面覆盖了Java面试中关于JVM的常见问题,对于准备面试的Java开发者来说,是极好的复习材料。