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

需积分: 0 1 下载量 168 浏览量 更新于2024-07-15 收藏 10.75MB PDF 举报
"ali-java-interview.pdf" 这篇PDF文档是一个关于Java面试的汇总,涵盖了大量关于JVM、内存管理、垃圾回收以及引用类型的深入知识。以下是这些主题的详细说明: 1. JVM (Java虚拟机) 是Java程序运行的基础,它负责解释执行字节码并提供了一个运行时环境。在JVM中,内存被划分为不同的区域: - 程序计数器:每个线程都有自己的程序计数器,用于存储当前线程所执行的字节码的下一条指令地址。 - 虚拟机栈:也叫Java栈,用于存储方法调用过程中的局部变量表、操作数栈、动态链接和方法出口等信息。每个线程都有一个独立的虚拟机栈。 - 本地方法区:支持Java虚拟机调用本地(Native)方法,每个线程也有自己的本地方法区。 - 堆:所有对象实例都在堆中分配内存,是线程共享的数据区域。Java的内存管理主要是对堆进行管理。 - 方法区/永久代:存储类信息、常量、静态变量等,Java 8后被元空间(Metaspace)取代。 2. JVM运行时内存 分为新生代、老年代和永久代(Java 8后的元空间): - 新生代 主要包含Eden区、两个Survivor区(From和To)。对象首先在Eden区创建,经历Minor GC后,存活的对象会被复制到Survivor区,并更新其年龄,直到达到一定的年龄阈值后晋升到老年代。 - 老年代 存储生命周期较长的对象,一般采用标记整理算法进行垃圾回收。 - 永久代/元空间 存储类和接口的信息,包括类的方法、字段等。 3. 垃圾回收与算法 是Java自动内存管理的关键: - 如何确定垃圾 通常通过引用计数法和可达性分析来判断对象是否可到达,从而决定是否为垃圾。 - 垃圾回收算法 包括: - 引用计数法:简单但无法处理循环引用的问题。 - 标记清除算法:标记所有活动对象,然后清除未标记的对象,会产生内存碎片。 - 复制算法:将可用内存分为两部分,每次只使用一部分,回收时将活动对象复制到另一部分。 - 标记整理算法:标记后,将活动对象移动到一端,清理另一端。 - 分代收集算法:根据对象的生命周期特性,对不同代使用不同的垃圾回收策略。 4. JAVA四种引用类型 描述了对象的不同“存活”程度: - 强引用 是最常见的引用类型,只要强引用存在,对象就不会被垃圾回收。 - 软引用 可以在系统内存不足时被回收,用于实现缓存。 - 弱引用 在垃圾回收时会被立即清除,即使有弱引用指向对象。 - 虚引用 不能单独使用,仅用于跟踪对象在垃圾回收过程中的状态。 5. GC分代收集算法与分区收集算法: - 分代收集 将内存分为新生代和老年代,新生代常用复制算法,老年代常用标记整理或标记-复制算法。 - 分区收集 将堆进一步细分为多个连续的区域,可以提高垃圾回收效率。 6. GC垃圾收集器 是JVM提供的不同垃圾回收策略实现,如: - Serial 垃圾收集器,单线程执行,适用于小型应用。 - ParNew 是Serial的多线程版本,常与CMS收集器配合使用。 - ParallelScavenge 采用多线程复制算法,优化应用程序吞吐量。 - SerialOld 是Serial收集器的老年代版本,使用标记整理算法。 这些内容对于理解Java程序的运行机制和性能优化至关重要,是Java开发者面试时必须掌握的知识点。