Java秋招面试中Java特性与JVM基础
Java语言特性与JVM基础
面试重要程度:⭐⭐⭐⭐⭐
常见提问方式:JVM内存模型、垃圾回收机制、类加载过程
预计阅读时间:30分钟
开篇
兄弟,这章绝对是重中之重!JVM相关的问题在面试中出现频率超高,基本上每个面试官都会问。而且这些问题往往能看出你的技术深度,所以一定要好好掌握。
我见过太多人在这里栽跟头,明明其他方面都不错,就是JVM这块答不上来,结果就挂了。今天我们就把这些核心知识点彻底搞清楚。
🚀 3.1 Java 17+新特性面试要点
Record类(面试高频)
什么是Record类?Record是Java 14引入的预览特性,Java 17正式发布。它是一种特殊的类,专门用来存储数据。
面试中这样问:
面试官:"你了解Java的Record类吗?它解决了什么问题?"
标准回答:
// 传统写法(繁琐)
public class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
@Override
public boolean equals(Object obj) {
// 一堆代码...
}
@Override
public int hashCode() {
// 一堆代码...
}
@Override
public String toString() {
// 一堆代码...
}
}
// Record写法(简洁)
public record User(String name, int age) {
// 自动生成构造器、getter、equals、hashCode、toString
// 可以添加自定义方法
public boolean isAdult() {
return age >= 18;
}
// 可以添加验证逻辑
public User {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
}
}
使用场景:
- DTO对象
- 配置类
- 返回多个值的方法
- 不可变数据载体
虚拟线程(Project Loom)
面试重点:
面试官:"听说过虚拟线程吗?它和传统线程有什么区别?"
核心概念:
// 传统线程创建(重量级)
Thread thread = new Thread(() -> {
// 执行任务
});
thread.start();
// 虚拟线程创建(轻量级)
Thread virtualThread = Thread.ofVirtual().start(() -> {
// 执行任务
});
// 或者使用Executors
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> {
// 高并发IO任务
return "result";
});
}
虚拟线程的优势:
- 轻量级:创建成本极低,可以创建百万级别
- 高并发:特别适合IO密集型任务
- 简化编程:不需要异步回调,代码更直观
适用场景:
- Web服务器处理大量请求
- 数据库连接池
- 网络IO操作
- 文件处理
Pattern Matching(模式匹配)
面试考点:
// instanceof的模式匹配(Java 17)
public String formatObject(Object obj) {
if (obj instanceof String s) {
return "String: " + s.toUpperCase();
} else if (obj instanceof Integer i) {
return "Integer: " + (i * 2);
} else if (obj instanceof List<?> list) {
return "List size: " + list.size();
}
return "Unknown type";
}
// Switch表达式的模式匹配(预览特性)
public String processValue(Object value) {
return switch (value) {
case String s -> "String: " + s;
case Integer i -> "Integer: " + i;
case null -> "Null value";
default -> "Unknown: " + value.toString();
};
}
🧠 3.2 JVM内存结构深度解析
内存区域划分
面试必问:
面试官:"说说JVM的内存结构,每个区域存储什么内容?"
标准回答框架:
JVM内存主要分为以下几个区域: 1. 程序计数器(PC Register) 2. 虚拟机栈(VM Stack) 3. 本地方法栈(Native Method Stack) 4. 堆内存(Heap) 5. 方法区(Method Area)/元空间(Metaspace) 6. 直接内存(Direct Memory)
详细解析:
1. 程序计数器
// 程序计数器记录当前线程执行的字节码指令地址
public void method() {
int a = 1; // PC指向这条指令的地址
int b = 2; // PC指向下一条指令的地址
int c = a + b; // PC继续向下
}
特点:
- 线程私有
- 不会发生OutOfMemoryError
- 执行Java方法时记录字节码指令地址
- 执行Native方法时为空
2. 虚拟机栈
public class StackDemo {
public void methodA() {
int localVar = 10;
methodB(); // 创建新的栈帧
}
public void methodB() {
String str = "hello";
// methodB的栈帧在methodA的栈帧之上
}
}
栈帧结构:
- 局部变量表
- 操作数栈
- 动态链接
- 方法返回地址
常见异常:
// S
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java面试圣经 文章被收录于专栏
Java面试圣经,带你练透java圣经
查看18道真题和解析