本书籍《Java面试核心知识点整理》汇集了众多Java工程师在求职过程中所需掌握的关键技术和面试要点,适合希望深入了解或复习Java技术栈的开发者阅读。
### JVM核心知识点详解
#### 一、JVM内存区域与管理机制
**1.1 程序计数器(Program Counter Register)**
程序计数器是一块较小的内存空间,可以看作是当前线程所执行字节码行号指示器。每个线程都有一个独立的程序计数器,各个线程之间互不影响、存储信息不同,因此它被称为“线程私有”的内存。
**1.2 虚拟机栈(Java Virtual Machine Stacks)**
虚拟机栈描述的是Java方法执行时的内存模型:每个方法被执行的时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个线程都有独立的虚拟机栈。
**1.3 本地方法栈(Native Method Stacks)**
与虚拟机栈类似,但主要用于支持本地方法调用。本地方法栈为虚拟机使用到的Native方法提供存储空间。
**1.4 堆(Heap)**
Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此区域的主要目的是存放对象实例,几乎所有对象都在这里分配内存。这是垃圾收集器管理的主要区域,因此也被称作“GC堆”。
**1.5 方法区(Method Area)**
方法区也是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量等数据。Java 8之前称为永久代(PermGen space),而在Java 8中进行了重命名,并引入了元数据的概念。
#### 二、垃圾回收与算法
**2.1 如何确定垃圾**
- **引用计数法**:通过记录每个对象的引用数量来决定是否可以回收该对象。但由于无法处理循环引用的问题,这种算法在Java中并不常用。
- **可达性分析算法**:以一系列名为“GC Roots”的节点作为起点进行搜索,当一个对象到GC Roots没有任何引用链相连的话,则证明此对象是不可用的。
**2.2 垃圾回收算法**
- **标记-清除算法(Mark-Sweep)**:分为两个阶段:“标记”和“清除”。标记阶段标识需要回收的对象;清理阶段则释放被标记对象占用的空间。
- **复制算法(Copying)**:将内存划分为大小相等的两部分,每次仅使用其中一块。当这一块用完后,存活的对象会被复制到另一块上,并清空已使用的空间。
- **标记-整理算法(Mark-Compact)**:与“标记清除”类似,但后续步骤不是直接清理被标记对象的空间而是将所有活的内存移动至一端然后释放掉未使用部分。
- **分代收集算法**:根据对象活跃程度的不同,把堆分为新生代和老年代,并采用不同的回收策略。
#### 三、垃圾收集器
**3.1 Serial收集器**
Serial是单线程的,每次只用一个CPU或一条线程完成垃圾收集工作。
**3.2 ParNew收集器**
ParNew实际上是Serial多线程版本。
**3.3 Parallel Scavenge收集器**
Parallel Scavenge的目标在于获得可控制的吞吐量。
**3.4 Serial Old收集器**
Serial Old是一个单线程的老年代回收器,主要用于配合Parallel Scavenge工作。
**3.5 Parallel Old收集器**
它是Parallel Scavenge的老年代版本,采用多线程并行方式完成垃圾收集任务。
**3.6 CMS收集器**
CMS是一种以最短停顿时间为目标的回收器。适合注重交互体验的应用系统使用。
**3.7 G1收集器**
G1面向服务端应用设计,具备并发和高效利用多核的能力来减少STW(Stop The World)事件的时间。
#### 四、IONIO
**4.1 阻塞IO模型**
传统的阻塞模式如FileInputStream, FileOutputStream等会在线程等待数据准备好时进入挂起状态。
**4.2 非阻塞IO模型**
非阻塞模式下,用户线程发起请求后并不需要等待,而是直接返回。当准备完成后再次发出请求即可读写操作。
**4.3 多路复用IO模型**
多路复用技术允许单个线程监控多个文件描述符,在任一文件就绪时进行I/O操作以提高效率。
**4.4 信号驱动IO模型**
服务器程序处理并发连接的另一种方法,通过注册信号函数来实现。
**4.5 异步IO模型**
异步模式中用户请求被发送给内核后立即返回。当数据准备完毕会通知或直接传递结果到用户进程。
**4.6 JAVA IO包**
Java中的IO包提供了丰富的类和接口处理输入输出流,包括InputStream、OutputStream