Java虚拟机面试深度解析:JDK、JRE、垃圾收集与内存分区

需积分: 0 0 下载量 181 浏览量 更新于2024-06-30 收藏 1.48MB PDF 举报
"Java虚拟机面试题全面解析" Java虚拟机(JVM)是Java程序运行的基础,它提供了执行字节码的环境。JDK(Java Development Kit)是开发和运行Java应用程序的工具集,包含了JRE(Java Runtime Environment),后者是运行Java程序所需的环境,包括Java虚拟机、类库和其他必要的组件。 自Java诞生以来,其版本经历了多次更新,每个新版本都引入了重要的特性。例如: - Java Version SE 5.0(也称为Java 1.5)引入了泛型、枚举、注解等特性。 - Java Version SE 6增强了Swing、NIO.2以及动态语言支持。 - Java Version SE 7(Java 7)带来了Try-with-resources语句、多租户应用程序、改进的数组操作等。 - Java 8是重大更新,引入了Lambda表达式、函数式编程、默认方法、新的日期和时间API等。 在JVM运行时数据区域中,每个线程都有自己的程序计数器、Java虚拟机栈和本地方法栈,而Java堆和方法区是所有线程共享的。其中: - 程序计数器记录当前线程正在执行的字节码指令地址。 - Java虚拟机栈用于存储栈帧,每个方法调用对应一个栈帧,包含局部变量表、操作数栈、动态链接、方法出口等信息。 - 本地方法栈服务于Java虚拟机的本地接口,为native方法服务。 - Java堆是对象实例的存储区域,使用分代收集算法进行垃圾回收。 - 方法区存储类的元数据,如常量池、字段信息、方法信息等。 对象访问在Java中通常是通过句柄方式实现的,Java虚拟机持有一个指向对象在堆中的实际地址的指针,而对象的实际数据存储在堆中。 判断对象是否“死去”,即判断是否可以被垃圾回收,有两种主要方法: 1. 引用计数法:每个对象有一个引用计数,当引用数变为0时,对象被视为可回收。但这种方法无法处理循环引用问题。 2. 根搜索算法:从一组被称为“GC Roots”的对象出发,如果一个对象到GC Roots没有任何引用链,那么这个对象是不可达的,可以被回收。Java使用的就是这种算法。 Java提供了四种引用类型: - 强引用:最常见的引用,只要还有强引用指向对象,就不会被垃圾回收。 - 软引用:在系统即将发生内存溢出之前,会回收软引用指向的对象。 - 弱引用:只有当垃圾收集器工作时,才会回收弱引用指向的对象。 - 虚引用:不直接获取对象,只用于接收对象被回收的通知。 垃圾收集算法包括: 1. 标记-清除算法:标记所有存活对象,然后清除所有未标记的对象。缺点是效率低,且会造成内存碎片。 2. 复制算法:将内存分为两部分,每次只使用一半,当一半空间满时,将存活对象复制到另一半,然后清空已使用的一半。优点是效率高,缺点是浪费了一半的空间。 3. 标记-整理算法:标记存活对象后,让所有存活对象向一端移动,然后清除边界外的对象。适用于老年代,避免了内存碎片。 4. 分代收集算法:根据对象的生命周期将堆分为新生代和老年代,不同代使用不同的垃圾收集策略。 Java内存管理中,堆内存通常被划分为年轻代和老年代,年轻代又细分为Eden区和Survivor区,使用不同的垃圾收集策略来优化性能。内存分配原则主要是根据对象的生命周期和大小来决定是在新生代还是老年代分配。 类加载器是JVM的重要组成部分,负责加载类文件到JVM中。类加载器分为启动类加载器、扩展类加载器和应用程序类加载器,以及用户自定义的类加载器。类加载器的作用在于实现类的动态加载和隔离,保证了类的安全性和唯一性。