2023 JVM面试精华:50道经典面试题与深度解析

4 下载量 162 浏览量 更新于2024-06-22 收藏 29KB DOCX 举报
本文档汇总了2023年的JVM面试题及其答案,共涉及50个问题,覆盖了广泛的JVM内存管理、常量池、内存区域、运行时栈帧结构、内存模型以及垃圾回收机制等内容。以下是部分知识点的详细解析: 1. **对象内存分配**: - 对象和数组通常在Java堆中分配内存,但根据逃逸分析,如果对象没有逃逸出方法作用域,可能会在栈上直接分配,这可以提高性能。 2. **常量池**: - JDK 1.8及以上版本: - **字符串常量池**:存储在堆中,包括`String`对象调用`intern()`方法后的实例和直接创建的字符串。 - **运行时常量池**:存储在方法区(元空间),存放类加载后的一些常量数据,如类中的`constant_pool`。 - **类文件常量池**:JVM的一个概念,存储在.class文件中。 3. **动态年龄判断与内存管理**: - `-XX:TargetSurvivorRatio`和`-XX:MaxTenuringThreshold`参数用于控制年轻代的eden和survivor区的使用策略,当某个年龄的对象占用内存超过预设比例,会触发晋升到老年代。 4. **永久代(元空间)**: - JDK 8前,Hotspot使用永久代,JDK 7以后,字符串常量池和静态变量移出到堆,JDK 8彻底移除永久代,引入元空间,这部分内容现在直接在本地内存中分配。 5. **JVM运行时内存区域**: - Java 8后: - **程序计数器**:记录当前线程执行的字节码指令流位置。 - **Java虚拟机栈**:存放局部变量和操作数。 - **堆**:存放所有对象和数组。 - **方法区(元空间)**:存储类信息、常量池等。 - **本地方法栈**:存放native方法的调用信息。 6. **运行时栈帧结构**: - 包含局部变量表、操作数栈、动态链接、返回地址和附加信息,用于方法执行过程中的临时存储。 7. **JVM内存模型**: - 定义了一种抽象的内存模型,确保跨平台并发的一致性,区分工作内存(线程可见但不直接可写)和主内存(所有线程共享的内存区域)。 8. **垃圾对象的判定**: - 使用可达性分析算法,通过GCRoots检测对象是否可达,如果一个对象不再有任何引用链(ReferenceChain)连接到GCRoots,就认为它是垃圾对象,会被垃圾收集器回收。 这些知识点深入理解了JVM内存管理和运行时行为,对于准备JVM面试或者深入研究JVM原理的学生和开发者来说,都是宝贵的参考资料。