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

全部评论

相关推荐

08-17 09:10
门头沟学院 Java
须知:面经来自录音,通过Buzz转文字+AI&nbsp;整理,出现一些纰漏在所难免,仅供参考。不喜勿喷1.&nbsp;谈一谈你对Java&nbsp;GC的理解2.&nbsp;看你对你的这些项目里面哪一个你觉得最熟悉或者觉得最值得讲一点可以讲一下吗3.&nbsp;你在这里用的是自己集成的AI框架吗?是用了Spring&nbsp;AI这种框架还是说自己做了集成?4.&nbsp;你这边集成MCP之后,假如说我想用你这个智能体的服务部署后配置我自己的MCP,我可以这样做吗?能够提供对外扩展MCP的功能吗?5.&nbsp;你这里的MCP的实现是相当于是怎么个实现法?假如说我想调用你的PDF生成然后生成一个PDF文件,你那边是怎么通过调用MCP把文件给客户端?6.&nbsp;对于你这个服务,你的MCP客户端是你的服务器吗?你的PDF生成的服务端是在哪里的?你调用自身的MCP吗还是说你的PDF生成是一个外部的服务?7.&nbsp;你的PDF生成的MCP和你的agent服务是部署在一个项目里面吗?它是自身MCP的服务器又是MCP的客户端,是在一起还是分开的?8.&nbsp;用的协议是什么?MCP本身有几种方式,用的是SSE?SSE能推送二进制文件吗?9.&nbsp;你有了解过MCP现在还支持什么协议吗?你有没有了解到SSE这个协议它本身现在已经是弃用了的?10.&nbsp;你看下面有一道ReAct模式构建自主规划智能体,这个是个什么模式?11.&nbsp;你的ReAct是在代码实现上你是怎么做这个事情的?这个Prompt你是怎么把它结合起来?12.&nbsp;你这里是怎么做这个或者你的Prompt是怎么写的?你是怎么实现这个功能的?13.&nbsp;我提出一个任务,后面是有分几个Agent来做一件事吗?14.&nbsp;Agent的分工是怎么做的?15.&nbsp;你觉得多Agent和单Agent他们两个最大的各自的优劣能说一个吗?单Agent有什么局限,多Agent有什么好处?16.&nbsp;除了复杂处理任务的情况之外,多Agent还有其他的好处吗?17.&nbsp;我一个Agent我也能配很多个工具来做一些复杂的事,但是我为什么要多个Agent来调而不是一个?18.&nbsp;你可以先想想大模型现在有什么局限?19.&nbsp;从使用角度来说,你觉得大模型还有什么问题?20.&nbsp;你平常开发Spring你有遇到过在关于依赖注入的问题吗?21.&nbsp;你觉得JavaX和Spring它本身,对于依赖注入这个东西它为什么要JavaX里面为什么要提供一个Resource?22.&nbsp;你平常有遇到过AOP失效的场景吗?23.&nbsp;自身调用导致失效,它为什么就不会经过代理对象?代理对象是通过什么方式来实现?24.&nbsp;JDK动态代理和CGLIB它们有区别吗?25.&nbsp;CGLIB它是通过什么方式来实现生成这个子类?26.&nbsp;你平常有用过线程池吗?线程池里面有几个参数,每个参数它的作用是什么?27.&nbsp;假如说我有一个线程池,这里的参数你设置的时候有什么依据吗?28.&nbsp;CPU密集型和IO密集型这两点它们的区别是什么?如果不这么设置,会有什么问题?29.&nbsp;为什么要设置keepAliveTime这个参数?它为了解决什么问题?
查看28道真题和解析
点赞 评论 收藏
分享
lz是25届毕业生,现在回想去年秋招,总结下来真就一个字“寄”。从自身角度来看,一是最开始的打算是进行考研,考研的资料啥的也都买好了,但是事与愿违,出了一些难以预料的事情(本科进的实验组导师打压和PUA😩),复习计划也是没法持续进行。二是从实验组跑路后转战秋招,现在想想我的第一份简历真的是一坨啊,一个博客项目和一个实训写的考勤管理项目,以及C1驾照(真的一坨),还有一开始八股问题一个都不会,就连浏览器输入URL解析过程这种都不知道,力扣也没怎么刷,在面试和八股网站不停学习后,简历也是越改越像样了,项目也是一直在改进,换过聚合搜索平台到ai问答平台(毕竟这两年简历上没有ai相关项目感觉有点落伍了,而且lz还是人工智能专业,面试时候都会问到ai相关的事情),在不停的面试失败后,最好拿到了一个深圳的后端实习转正offer。三是当时已经九月份中旬了,同实验组跑路的同学已经拿到杭州hkws的实习offer,考虑到时间等各方面因素,lz也就没有再继续找别的offer,直接就去了深圳那边(lz安徽的),记得当时做的20多小时的绿皮火车有点难绷。实习过程中也是一直在投递秋招,但是整个市场对于我这种学历一般,简历不出众并不感冒,大公司无一例外全挂,只能面一些ssob上的公司约的面试(即使这样也只有四五个面试),在十二月份左右通过一家杭州的公司,业务方向和实习公司是一样的,但也需要提前实习,但lz学校那边有些事情要处理加上lz不想再继续实习了,就拒掉了。在然后就没有然后了,lz的秋招就已经宣告结束了,惨败而归,后面寒假回家后也是继续刷力扣,lz寒假也想开了,计算机干不了就不干了,谁要就去哪,然后就到了春招了,一开始也是ssob疯狂投递,也都要完简历就没后续了(当时已经彻底绝望了,想着不行毕业就去跑外卖了,lz家里一般,甚至可以说是比较穷的那种,父母都是农民,一年也就那点收成),一直等到了现在这个公司来我们学校宣讲,投递简历后,后续开始约面试,结果一切都很快,一周之内发了offer,当时我都傻眼了,从没想过居然会有公司给我发正职不需要提前实习的offer(是个制造业,但lz也投了其他制造业公司的官网,也都是没有后续),当时也是没有选择,就直接签了三方但不知道是时来运转还是怎么着,ssob上约面开始多了起来,有了保底后,lz整个人也是有了底气(感觉有底气确实不一样,整个人面试状态也很好),后续也拿到一些小公司的offer,最后综合了一下都拒掉了,因为一开始的制造业公司是家那边的,也比较知名,其他小公司都是外地的,综合工资并没有高太多。这就是一个双非本菜鸡的秋招回忆录
我的秋招“寄”录
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

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