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

版权申诉
0 下载量 123 浏览量 更新于2024-07-01 收藏 10.65MB PDF 举报
"这份资料是2020年更新的Java面试题库,包含了详细的解答,涵盖了JVM、内存管理、垃圾回收等多个核心Java技术领域。" 这份文档详细阐述了Java开发者在面试中可能遇到的问题及其答案,主要关注Java虚拟机(JVM)的工作原理以及垃圾回收机制。以下是对这些知识点的深入解析: 1. JVM内存区域: - **程序计数器**:每个线程都有自己的程序计数器,用于存储当前线程执行的字节码指令地址。 - **虚拟机栈**:同样线程私有,用于存储方法调用过程中的局部变量、操作数栈等信息。 - **本地方法区**:为JNI(Java Native Interface)提供服务,存放 native 方法的调用信息。 - **堆(Heap)**:线程共享,用于动态分配对象内存,分为新生代和老年代。 - **方法区/永久代**:存储类信息、常量、静态变量等,Java 8后被元空间(Metaspace)替代。 2. JVM运行时内存分代: - **新生代**:新创建的对象首先位于Eden区,经历几次Minor GC后存活下来的对象晋升至Survivor区,再进一步晋升至老年代。 - **老年代**:存放长期存活的对象,一般采用标记整理算法。 - **永久代/元空间**:存储加载的类信息。 3. 垃圾回收算法: - **引用计数法**:简单但难以处理循环引用问题。 - **可达性分析**:通过根节点集出发,遍历可达的对象,其余视为垃圾。 - **标记清除**:标记所有存活对象,然后清除未标记对象,产生碎片。 - **复制算法**:将内存分为两部分,每次只使用一半,复制存活对象到另一半,避免碎片。 - **标记整理**:标记存活对象,然后整体向一端移动,清理另一端。 - **分代收集**:根据对象生命周期不同,选择不同的垃圾回收策略。 4. Java引用类型: - **强引用**:最常见的引用类型,只要存在强引用,对象就不会被GC。 - **软引用**:在系统将要发生内存溢出异常之前,会清理软引用指向的对象。 - **弱引用**:比软引用更弱,无论是否内存充足,只要进行GC就会回收。 - **虚引用**:几乎无用,仅用于跟踪对象被GC的状态。 5. GC分代收集算法与分区收集算法: - **分代收集**:新生代使用复制算法,老年代用标记整理或标记-压缩算法。 - **分区收集**:将堆分成多个小块,每个小块独立回收,减少暂停时间。 6. 垃圾收集器: - **Serial**:单线程,适合小内存应用,使用复制算法。 - **ParNew**:Serial的多线程版本,可配合CMS收集器。 - **ParallelScavenge**:多线程,优化吞吐量,使用复制算法。 - **SerialOld**:Serial收集器的老年代版本,使用标记-整理算法。 这份文档不仅适合面试准备,也是Java开发者深入理解JVM和垃圾回收机制的宝贵资料。