深入理解JVM:面试必备的5大核心知识点解析

需积分: 0 1 下载量 125 浏览量 更新于2024-06-23 收藏 29KB DOCX 举报
"JVM 50 道面试题及答案涵盖了JVM内存管理、对象分配、常量池、动态年龄判断、永久代、运行时内存区域、栈帧结构以及内存模型和垃圾回收等内容。" 1. **对象分配**: - 对象和数组主要在堆内存中分配,但如果是局部变量且没有逃逸到方法外部,可能被优化存储在栈上。 2. **JVM常量池**: - JDK 1.8以后,字符串常量池位于堆中,包括通过`intern()`方法和双引号创建的字符串。 - 运行时常量池存储在方法区(元空间),包含了类加载后的常量信息。 - 类文件常量池是JVM概念,存在于类文件中,包含类的各种元数据。 3. **动态年龄判断**: - `-XX:TargetSurvivorRatio`参数用于设置Survivor区的目标使用率,默认为50%。 - 当Survivor区中相同年龄对象的总大小达到Survivor区的50%目标使用率时,这些对象会直接晋升到老年代。 - `-XX:MaxTenuringThreshold`设置对象晋升老年代的最大年龄阈值。 4. **永久代与元空间**: - 在JDK 8之前,Hotspot JVM的方法区是永久代(PermGen)。 - 从JDK 7开始,字符串常量池和静态变量移到堆,JDK 8彻底移除永久代,引入元空间,元空间在本地内存中分配。 5. **JVM运行时内存区域**: - 程序计数器:记录当前线程执行的指令地址。 - 虚拟机栈:每个方法对应一个栈帧,存储局部变量、操作数栈、动态链接等。 - 堆:存储所有对象实例和数组。 - 方法区(元空间):存储类的元数据,如运行时常量池。 - 运行时常量池:存储类的常量和符号引用。 - 本地方法栈:支持Java方法调用的非Java代码(如C/C++ native方法)。 6. **运行时栈帧结构**: - 局部变量表:存储方法的局部变量。 - 操作数栈:执行计算操作的栈。 - 动态连接:存放方法的常量池引用。 - 返回地址:标识方法返回的位置。 - 附加信息:其他辅助信息,如异常处理器表。 7. **JVM内存模型**: - 工作内存和主内存两部分,线程间通信通过主内存。 - 工作内存是线程私有,包含栈和局部变量表。 - 主内存是共享的,包含堆和方法区。 8. **垃圾对象判定**: - JVM使用可达性分析算法,通过GC Roots来确定对象是否可达。 - 如果对象无法从GC Roots直接或间接引用,会被标记为垃圾,准备回收。 以上是JVM面试题中的核心知识点,涉及了JVM内存管理的多个方面,理解和掌握这些知识对于优化Java应用程序性能至关重要。