JVM面试必备:核心概念解析与面试题集锦

需积分: 0 1 下载量 159 浏览量 更新于2024-08-03 收藏 29KB DOCX 举报
"JVM 45 道面试题及答案.docx" 在Java虚拟机(JVM)中,栈帧是线程执行方法时创建的结构,它包含了以下几个关键部分: 1. 局部变量表:存储方法的局部变量,包括方法参数和局部变量。每个变量都有一个槽位,用来存放基本数据类型或对象引用。 2. 操作数栈:也称为操作栈,执行计算操作的地方。当执行方法时,指令会将操作数压入栈,然后进行运算,最后将结果弹出。 3. 动态连接:用于存储调用方法的信息,如常量池的引用,便于动态解析。 4. 返回地址:当方法执行完毕时,控制权会返回到调用者,返回地址记录了接下来要执行的字节码指令的位置。 程序计数器(PC寄存器)是每个线程私有的,其主要作用是记录当前线程执行的字节码的行号。它在多线程环境下确保了每个线程能正确地执行自己的代码流,而不是互相干扰。 字符串常量在JVM中的存储位置有所变化。在JDK 8之前,字符串常量池位于永久代(Perm Generation),但自JDK 8起,字符串常量池被移到了堆中。类文件常量池则位于方法区(在JDK 8之后被称为元空间),存储类和接口的元数据。 垃圾收集是JVM自动管理内存的过程。常见的垃圾收集算法包括: 1. 标记清除:标记所有活动对象,然后清除未标记的对象,导致碎片问题。 2. 复制算法:将内存分为两块,每次只使用一块,当一块满时,将存活对象复制到另一块,然后清空已使用的块,避免碎片,但浪费了一半的空间。 3. 标记整理:标记活动对象,然后让所有存活对象向一端移动,清理另一端,解决了碎片问题,但效率较低。 4. 分代收集:根据对象的生命周期将内存分为新生代和老年代,分别采用不同的算法,如新生代使用复制算法,老年代使用标记清除或标记整理。 在Java中,引用类型分为四种: 1. 强引用:最常见的引用类型,只要强引用存在,对象就不会被垃圾收集。 2. 软引用:当内存充足时,软引用对象不会被回收,只有在内存不足时才会回收,用于实现缓存。 3. 弱引用:比软引用更弱,无论内存是否充足,垃圾收集器都会回收被弱引用关联的对象。 4. 虚引用:几乎不提供任何实际的引用功能,对象随时可能被回收,通常与引用队列一起使用,以便在对象被回收时得到通知。 JVM判断对象是否可回收主要通过两种方法: 1. 引用计数法:为每个对象维护一个引用计数,当计数为0时,对象被认为可回收。但这种方法不能处理对象之间的循环引用问题。 2. 可达性分析:通过从一组称为GC Roots的根对象出发,遍历所有可达的对象,不可达的对象被视为可回收。这是现代JVM普遍采用的方法,能够有效处理循环引用。