春招,进阿里了!
大家好,我是鱼皮。20 年的时候我认识了一位朋友,他当时拿了阿里、字节、腾讯、美团、拼多多、虾皮的 offer,可谓是名副其实的面霸了。今天分享一下他的求职面经,希望对朋友们有帮助。
原文链接:https://www.nowcoder.com/discuss/353157113763536896
本文已获得原文作者授权
前言
个人背景是东北某 985 科班本硕,做的 Java 开发,有两个自己写的小项目。
先分享一些让我印象比较深刻的面试题:
具体问题
线程安全本质是什么,Java 如何保证线程安全,callable,runnable 有什么区别,线程不正常终止会发生什么,线程占用的空间具体是哪,是寄存器还是内存还是什么 Java 的线程和 Linux 的线程有什么区别,为什么需要 Java 的线程 volatile 具体实现原理,内存重排序都会发生在哪,为什么要内存重排序 使用过哪些 Java 并发包 简述 BIO,NIO 的具体使用及原理 concurrentHashMap1.8 和之前版本有什么区别,HashMap 的具体实现,红黑树和平衡二叉树的区别,为什么不用 B+ 树 Java 的 GC 整体过程,垃圾收集算法,流程,垃圾收集器,强引用,弱引用,虚引用等概念等,如果我要设置一个内存缓冲区,让垃圾收集器不对其进行操作怎么办 JVM 内存分区,。假设 Java 的 GC 时间过长,简述应该如何做来排查解决这个问题,jamp 的 dump 命令比较重,有什么代替的方法。 代码实现每五分钟一次 Minor GC,如果要 FullGC 呢 ThreadLocal 的具体是怎样的,为什么会有内存泄漏问题,怎样避免 Java 的异常种类有哪些,平时自己是怎么处理异常的 Spring 的 IOC 和 AOP 及 MVC 机制,Sping 中的单例 bean 是否可以依赖多例 bean Springboot 起步依赖有什么好处,为什么使用 MyBatis 不适用数据库连接池 tomcat 如果有两个项目,两个项目里面如果有相同的 class,那么 tomcat 是如何对其进行区别 简述 MySQL 的 ACID 性质及实现,ACID 有哪些一致性种类,乐观锁怎么实现的,简述 MySQL 的隔离机制及实现,简述 MySQL 索引结构及实现 如果 MySQL 要插入十万条数据,有什么较好的方法 Redis 支持集群的几种方式,redis 的跳表要实现快速查找第 k 小的元素怎么做 Netty 拆包粘包的实质,Netty 线程池中的线程建立连接之后,这条连接是不是始终属于这个请求,对于 Netty 来说是不是只占用服务端的一个套接字,了解 zero copy 嘛 简述 TCP 三次握手四次挥手的状态转移,ip 层的 mtu 是什么,如何探测机器之间的 mtu 进程和线程的区别,进程的通信方式,线程空间中的内容,进程中打开文件其他线程可以直接读写那个文件嘛。用户态和内核态对于读写文件的操作有什么区别 内存为什么分页,虚拟内存有什么用,内存中的脏页是由硬件完成还是软件完成 怎样用单线程实现 2k QPS 对于服务器压测,1 s 均匀发 2 k 条消息,可以异步返回 Nginx 和 Redis 能同时处理很多条请求,万级别,是不是都是通过 Linux 中的 IO 模型的的类似信号的机制.想这样的 C10 K问题,也就是单机 10000 条并发连接应该如何去处理 设计高并发秒杀系统,里面的阻塞队列是如何实现的 在王者荣耀里面,当渲染地图时,考虑网络波动的情况应该怎样渲染地图才能显得不卡,这回导致什么问题 如何实现 cookie 和 session 机制 token 在分布式服务器上的应用,用什么框架来验证 token;除了 redis 还可以怎么做异步框架
总结
问题基本就是这些,除了常规的知识点问题之外,就是一些网络通信,系统设计之类的综合性一点的问题。当然问题都是根据各人简历来问的,所以也许各人的不一样,但是有一些通用性的东西可以和大家分享一下。
Java 的面试大概就分成 Java 本身,Spring 等各种框架,RPC,消息队列中间件,数据库,计算机网络,操作系统这几方面来考
首先 Java 的一些基础知识,比如 hashMap 实现,ArrayList 实现,ThreadLocal 实现等就去看源码就好了
然后就是 Java 的一些并发相关的知识看《Java 并发编程艺术》基本就够了,这本书称得上是面试神书,基本考并发的内容答案都能在这本书上找到,当然书本本身并不是很好理解
《深入理解 Java 虚拟机》同样也是面试神书,基本 JVM 虚拟机的内容答案都在这本书上
至于 Java 的 IO 相关的知识其实主要就是 NIO 和 BIO 两种,不过现在很多也是在使用 Netty 框架了。
Spring 的话 IOC 和 AOP 其实是老生常谈的东西,阅读源码当然是了解 Spring 的极佳途径,但是当大家没有精力阅读源码的时候,自己实现一个简易版的 IOC 和 AOP 也是一个极佳的做法。
MySQL 的学习的话推荐大家去看看尚硅谷的 MySQL 高级课程,基本可以对于 MySQL 有个大概的了解,小白的话可以先看看《MySQL必知必会》。
Redis 就直接看《Redis 设计与实现》好了,这本书真的是通俗易懂,读起来几乎没什么障碍,小白的话应该也可以直接上手
至于 RPC,消息队列等,推荐大家就去使用一下,然后针对某个方面的源码去看就好了,要把源码整个看掉还是比较难得。比如 RPC,现在一般的方法都是
服务器发表服务到 zookeeper 上 --> 客户端去 zookeeper 上申请服务 --> 申请成功后客户端调用方法 -->实质是通过代理模式传递 packet --> 通过 Neety 传递 packet 到服务端 --> 服务端处理请求之后通过 Netty 写回 大概就是整个过程,大家可以自己实现一下。
至于计网和操作系统大家应该都会(你懂的),我就不多说了
刷题这部分的话也没什么太多的诀窍,就把剑指 offer 和 LeetCode top100liked 和 top interviewed 还有 leetcode 前三百刷熟吧,面试时候还是会有很多原题的。
基本上分享的内容就是那些了,接下来就是本人的一些碎碎念。对于 Java 开发校招的基本知识就是以上说的那些,但是感觉就校招本身而言还是有可以进步的地方。
无论是 Spring,Netty 等框架的源码,各种中间件的源码,还是一些实际的工程亮点都可以作为突出的地方。
但是对于在校生而言实际工程也许会比较难我比较推荐大家看看 RPC 源码,然后深入看 Netty 源码看看网络通信是怎么做的,这两方面感觉会和实际关联非常紧密。
或者看看 Spring 的源码,实际 Java 工程几乎都是必须要用到的,也是一个加分项
欢迎学编程的朋友们加入鱼皮的 编程知识星球 ,鱼皮会 1 对 1 解决你的问题,直播带你做出项目、为你定制学习计划和求职指导,还能获取海量编程学习资源,和上万名学编程的同学共享知识、交流进步。一起加油!
往期推荐