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";
    });
}

虚拟线程的优势:

  1. 轻量级:创建成本极低,可以创建百万级别
  2. 高并发:特别适合IO密集型任务
  3. 简化编程:不需要异步回调,代码更直观

适用场景:

  • 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圣经

全部评论

相关推荐

12-07 18:50
已编辑
广州大学 Java
第一次面试,线下,不过感觉还好吧,也不紧张。20min笔试:1.&nbsp;exception和error的区别2.&nbsp;Thread.sleep(0)的意义以及其他相同作用的方案3.&nbsp;列出熟悉的设计模式,解释一下并给出应用场景4.&nbsp;uuid转base64编码后是多少位,请给出计算过程(怎么还会有这种题)5.&nbsp;项目中如何创建线程池,Exceutor的缺陷6.&nbsp;shutdown()的作用,是否会抛弃已提交未执行的任务7.&nbsp;单例模式的懒汉法和饿汉法区别8.&nbsp;对spring&nbsp;IOC的理解9.&nbsp;beanFactory和applicationContext的区别10.&nbsp;算法手撕:搜索二维矩阵现在只记得上面这些题,还有几题记不起来了我一开始没想到还会有笔试和算法,说是笔试通过后才会有面试……不过还好算是比较简单,但是uuid那题没写出来……面试:1.&nbsp;switch比对string的代码是什么样的,如果string是null该怎么办我说如果是null我会在switch之前进行if判断,因为switch不能用null会抛异常,hr说可以(不过我后来网上查了还是不行)2.&nbsp;手撕sql:有user和phone两张表,需要查询phone表中有两条及以上记录的user平时mp用惯了没怎么写过sql了,写了个子查询hr说不是最佳方案3.&nbsp;现在有abc三个任务,c需要在a和b完成后才能开始执行,请给出三个任务执行时间最短的方案a和b提交到线程池并行处理4.&nbsp;future的返回实体是什么我说是封装泛型的future,hr说是future的子类(?)5.&nbsp;线程池中除了future和completefuture外,还有什么方法可以监控任务是否完成countDownLatch和cyclicBarrier6.&nbsp;异步为什么要选择mq,直接开个线程不行吗我说mq有重试机制,而且可监控,整体稳定性和健壮性比较强7.&nbsp;遇到解决不了的问题会干些什么我说上网查,问ai,hr说为什么不问同学(?)8.&nbsp;如果有一个接口上线有bug,如何快速排查到接口内部存在问题的代码我说首先直接看看bug是什么,如果根据bug情况无法判定的话会进行debug打断点慢慢排查。但是hr好像是想让我回答git,说直接看当前版本与上个版本该接口的差异就好了9.&nbsp;你了解过git的历史吗(?)🈚10.&nbsp;如何实现每月签到我说redis的位图,hr说为啥要用redis,我说可以减轻数据库压力同时保障快速响应。hr说直接存本地缓存不就好了,我说每个用户都要维护一个位图,存本地不会oom么,hr没回答11.&nbsp;不用redis如何实现每月签到我说那就只能存mysql里面了,加个限流,然后sql表里是userId和位图字符串12.&nbsp;字符串和二进制的bit位差距我说只知道字符串比二进制要大……hr说不应该将位图用字符串的形式存储,占用空间太大,应该用int然后就是关于项目的问题以及反问了项目问的比较深,以场景题为主,结合项目问了很多场景题,可能是因为有笔试的缘故,八股问的就没那么多了。最后直接给了oc,但是我打算等年后再实习就说考虑一下了。第一次面试,整体体验跟想象中的差距还是蛮大的,不过hr其实人挺好的,感觉像老前辈,说让我思维保持灵活,不要老看网课要去多读一下电子书。然后说我们做程序员的,要多去思考当前技术栈解决不了的问题,而不是总想着利用现有的技术栈去解决问题。最后还劝我可以不着急现在找实习,现在机会少,可以等3月的实习,说我的简历可以多投一下中大厂,真是老前辈了不过准备了很久的jvm、计网os以及其他的倒是完全没问到
查看22道真题和解析
点赞 评论 收藏
分享
12-08 08:10
门头沟学院 Java
1.项目介绍2.高铁票抢票系统如何设计支持每秒10万+请求的高铁票抢票系统,确保库存准确且响应延迟&lt;500ms?3.酒店价格实时同步多渠道(携程/飞猪/美团)售卖同一酒店房源时,如何保证价格实时同步,避免价差纠纷?4.航班动态推送如何向100万+在线用户实时推送航班延误信息,支持按航线和用户等级优先推送?5.旅游订单分库分表携程年订单量超10亿,如何设计分库分表方案,支持按用户ID、订单时间、目的地多维度查询?6.缓存穿透防护用户高频查询不存在的酒店ID(如恶意攻击),如何设计防护机制,避免击垮数据库?7.支付超时处理用户支付超时未完成,如何高效回收订单库存并通知用户?8.分布式事务处理用户下单后,需同时扣减酒店库存、创建支付单、发送短信通知,如何保证三个操作的原子性?(SeataTCC模式+最终一致性9.搜索推荐优化用户输入"三亚&nbsp;亲子酒店"时,如何在300ms内返回精准结果,包含价格、评分、库存状态?10.秒杀活动设计节假日酒店秒杀活动,如何支撑每秒5万次下单请求,防止超卖和系统崩溃?11.JVM内存优化携程APP首页服务频繁OOM,堆内存占用持续攀升,如何通过内存分析和参数调优解决?12.分布式锁实现多服务实例并发修改同一酒店房价,如何保证价格更新的准确性?13.日志检索平台如何设计日均10TB的业务日志检索平台,支持按订单号、用户ID快速定位问题?14.缓存一致性酒店库存信息在MySQL和Redis中如何保持一致,避免用户看到的库存与实际不符?15.服务熔断降级机票查询依赖第三方航司API,当API响应延迟超3秒时,如何设计熔断策略保证核心功能可用?16.地理位置检索如何实现"附近5公里内评分4.5以上的酒店"功能,支持高并发查询?17.分布式ID生成携程订单号如何设计,既能保证全局唯一,又能包含时间、业务线等信息?18.数据迁移方案如何将10亿条历史订单从MySQL平滑迁移到ClickHouse,迁移过程不影响线上查询?19.高可用架构核心预订服务如何设计多活架构,保证单机房故障时业务不中断?
点赞 评论 收藏
分享
面试了万兴科技,两天两面,分享个面经,攒个运,求oc一面自我介绍C#&nbsp;相关知识点扩展方法什么情况下使用扩展的方式c#有没有内存泄露C#内存回收机制有没有C#调C++的库如果在调用动态链接库的时候有内存怎么处理C函数对象是class是什么传参如果是值传递过程中改变对象的属性值会有什么问题这个参数in&nbsp;&nbsp;out&nbsp;修身参数&nbsp;ref有什么区别C#&nbsp;视觉里面能不用用in&nbsp;&nbsp;outC#的多线程都用那些Task&nbsp;以及&nbsp;async/await&nbsp;区别task和thread的区别如果在线程中面选出刷新ui更新委托和事件有什么区别opencv主要做哪些事情C++怎么实现接口相关的设置在main函数之前执行一个函数怎么实现网络相关的工作做了吗用的什么技术做的局域网TCP&nbsp;粘包项目中有处理这个逻辑吗数据库的优化有了解过吗快速回答,给出口语化的回答HTTP通信了解过吗,快速回答,给出口语化满分的回答http的头部结构头部字段和请求字段怎么分清你最后发送的都是字符串,在使用http的时候怎么区分哪一部分是头部哪一部分是别的如果我的body里面有空行怎么处理请求方式有几种什么情况下用head的方式有没有定位问题崩溃什么的这边会怎么处理崩溃报告怎么看混淆你了解过吗你刚才说的扩展方法如果混淆怎么用二面自我介绍别人都搞C++为什么你要搞C#你自己以后一直想做C#吗最近几年的C#在国内不太多了你知道吗C#用的几点几对控件了解吗控件有重绘的吗假设现在做一个仪表盘的控件怎么做的你说的都是UI层面的,现在有数值变化当前以速度为例靠什么驱动指针你在做这些系统碰到过比较难的问题是什么怎么解决的,(横向)了解设计模式吗?用过IOC吗第三方的DL的容器的原理了解吗现在需要去配置我的动态类,创建类的什么,去增加类或移除了类不影响自己实际的使用,我在上一层调用下一层类的时候根据自己需要创建,怎么去实现提到反射,你又用反射做过什么吗设计模式最常用的是什么单例模式怎么做到&nbsp;只有一个实例你给老师做项目的强度高吗base在长沙有问题吗反问流程实习啥的
点赞 评论 收藏
分享
评论
1
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务