Java虚拟机(JVM)深度面试解析
需积分: 1 42 浏览量
更新于2024-06-18
收藏 1.51MB PDF 举报
"《剑指offer》JVM面试题总结.pdf"
JVM(Java Virtual Machine)是Java程序的核心组成部分,它的主要作用是提供一个抽象的、与操作系统无关的执行环境,使得Java程序可以在任何支持JVM的平台上运行,实现“一次编写,到处运行”的目标。
Java的内存区域主要分为以下几个部分:
1. **虚拟机栈**:每个线程都有自己的虚拟机栈,用于存储栈帧,栈帧包含了局部变量表、操作数栈、动态链接和方法出口等信息。每当方法被调用时,就会创建一个栈帧,方法执行完毕后,栈帧随之出栈。
2. **本地方法栈**:与虚拟机栈类似,但服务于Java的本地方法(如用C++编写的JNI方法)。
3. **堆**:线程共享的内存区域,所有对象实例和数组都在堆中分配内存。堆内存被分为新生代和老年代,以适应不同生命周期的对象。
4. **方法区**:存储已加载的类信息、常量、静态变量等。在Java 8及之后版本,这部分被替换为元空间(Metaspace)。
5. **程序计数器**:记录当前线程正在执行的字节码指令的地址,用于分支、循环、异常处理等。
6. **运行时常量池**:属于方法区的一部分,存储字符串常量、符号引用等。
Java中的类加载机制遵循“加载”、“验证”、“准备”、“解析”和“初始化”五个步骤。其中,加载是找到类的二进制数据,验证确保数据正确性,准备为类的静态变量分配内存并初始化为默认值,解析将符号引用转换为直接引用,初始化则执行类的初始化方法(<clinit>)。
对象在JVM中的创建过程包括:
1. 类加载检查:确保类已被加载、验证、准备且尚未初始化。
2. 分配内存:在堆中分配内存,可能采用指针碰撞或偏向锁等策略。
3. 初始化零值:为对象的实例变量赋予默认值。
4. 对象头设置:包含对类型信息的引用以及同步、GC等信息。
5. 构造函数调用:执行类的构造方法,完成对象的初始化。
垃圾回收是JVM的重要功能,用于回收不再使用的对象所占用的内存。常见算法有:
1. **标记-清除算法**:标记所有存活对象,然后清除未标记的对象,效率低,易产生碎片。
2. **标记-复制算法**:将内存分为两部分,每次只使用一半,将存活对象复制到另一半,简单高效,但浪费了一半内存。
3. **标记-整理算法**:标记存活对象后,将所有对象向一端移动,然后清理边界外的内存,适合老年代。
记忆集和卡表是并发GC中的概念,用于快速定位对象。卡表记录了对象所在的内存页,当对象发生写操作时,通过写屏障更新卡表,以便垃圾收集器快速识别变化。
三色标记法是G1垃圾收集器的一种算法,标记对象为白色(未访问)、灰色(已访问,其子对象未访问)和黑色(已访问,其子对象也已访问)。在并发模式下,三色标记可能导致不一致的状态,需要额外的处理来保证正确性。
垃圾收集器有很多种,如:
1. **Serial**:单线程的新生代收集器,适用于小型应用。
2. **ParNew**:Serial的多线程版本,常与CMS配合使用。
3. **Parallel Scavenge**:关注吞吐量,可通过调整参数控制新生代的GC频率。
4. **Serial Old**、**Parallel Old**:单线程、多线程的老年代收集器。
5. **CMS(Concurrent Mark Sweep)**:并发标记扫描,追求低停顿时间。
6. **G1(Garbage-First)**:并行且并发的垃圾收集器,目标是确定性地控制垃圾回收暂停时间。
JVM调优通常涉及各种参数设置,如堆大小(-Xms, -Xmx)、新生代和老年代比例(-XX:NewRatio)、垃圾收集器选择(-XX:+UseConcMarkSweepGC)等,调优目的是平衡性能和内存使用。
双亲委派模型是类加载机制的一种策略,它规定除Bootstrap ClassLoader外,每个类加载器在尝试加载类时,都会将任务委托给父加载器。这种模型保证了系统类加载的一致性和稳定性,但也存在破坏的情况,如自定义类加载器的实现。
以上是对JVM面试题的综合概述,涵盖了JVM的主要功能、内存管理、类加载机制、垃圾回收算法和调优等多个方面。理解这些知识点对于深入学习Java和进行JVM优化至关重要。
2023-10-09 上传
2020-03-28 上传
2024-10-14 上传
2021-01-27 上传
2024-01-01 上传
五轮车
- 粉丝: 1126
- 资源: 280
最新资源
- JavaScript实现的高效pomodoro时钟教程
- CMake 3.25.3版本发布:程序员必备构建工具
- 直流无刷电机控制技术项目源码集合
- Ak Kamal电子安全客户端加载器-CRX插件介绍
- 揭露流氓软件:月息背后的秘密
- 京东自动抢购茅台脚本指南:如何设置eid与fp参数
- 动态格式化Matlab轴刻度标签 - ticklabelformat实用教程
- DSTUHack2021后端接口与Go语言实现解析
- CMake 3.25.2版本Linux软件包发布
- Node.js网络数据抓取技术深入解析
- QRSorteios-crx扩展:优化税务文件扫描流程
- 掌握JavaScript中的算法技巧
- Rails+React打造MF员工租房解决方案
- Utsanjan:自学成才的UI/UX设计师与技术博客作者
- CMake 3.25.2版本发布,支持Windows x86_64架构
- AR_RENTAL平台:HTML技术在增强现实领域的应用