面试职位: Java 研发工程师
我到了二轮,被刷了,原因不明,大概是我太菜了(╥_╥)。还记得二面最后问面试官觉得我怎么样?面试官说放心吧。
放心吧...
放心吧...
嘤嘤嘤,哭给你看哦
不过总结还是要的,虽然被刷了,但有其他公司的面试还在等着我啊!还是那句话,失败乃成功之母,我几乎记下了所有面试官问到的问题,由于不能透露具体题目,这里列一下大概的知识点(句号后面是我当时回答的思路):
一面
面试时间30分钟左右。
主要是关于计算机网络 TCP/IP 的知识以及操作系统的知识。
先问了一下在学校里各科的成绩,不提...
全局唯一有序 ID。 snowflake ,timestamp 加前面,然后后面加上机器 id 等
冯诺依曼体系
shell 命令的执行过程
信息熵
程序运行中的栈式结构,栈溢出***
TCP/IP 有关知识。TCP 传输层加端口号,IP 网络层加 ip 地址;路由器就主要工作在 IP 网络层
同步与阻塞
并行与并发
Java 线程的本质,内核线程与用户线程,线程调度,并行级别
内核态与用户态,中断
CPU 与内存与磁盘
缓存行与伪共享
内存分配管理,段页式。jemalloc
二面
二面时间40分钟左右。
主要是关于自己写的项目以及自己的学习生活。
还是先问成绩,不提...
Java 程序的运行原理
普通可执行程序的运行原理
缓存行与伪共享。两个面试官都问,可见十分重要,还好都答出来了
从浏览器发出请求开始,到服务端应用接受到请求为止的过程
HashMap ,hash 碰撞,hash 算法的优化
单点登录
正向代理与反向代理
反爬机制,爬虫模拟浏览器行为
cglib 方法拦截
动态代理
依赖注入
Servlet 的本质
TCP 长连接。心跳包,websocket
Netty 百万级长连接优化
DSL 解析到 AST 。lexer 和 parser
JVM 相关。(你读过 GC 相关源码吗?)
代码规范,包命名规范
大学里最有成就感的事
读过的 Java 书籍。(四大名著之类)
面试官贴心地给了我一些建议,让我在一些方面(比如 Netty 上挖深一点)。后来想想可能已经在发好人卡了
当然面试官还问了许多开放性题目,就不说了。大家从上面的面试知识点中也可以看出来,基础最重要(项目是用来加分的)。
阿里安排面试的速度相当的快,好评。
头一天投简历,第二天晚上就打来电话一面了,当时我还在唱k;
一面完了第二天二面。
================== 更新 ==================
500+收藏了,各位别这样啊?,这只是个总结,并不是什么面经。
既然大家这么有兴趣,我再多写点好了。
面试官提问的时候一般是按照“链式”提问的,一个问题后面可能跟着一连串更深层的问题,比如:
Q:Java 中线程的本质?
A:跟内核线程1:1,由操作系统调度,底层实现是 pthread。
Q:用户线程跟内核线程的区别是什么?
A:用户线程对 CPU 是透明的,不能被操作系统调度。
Q:并行与并发的区别是什么?(这个并不对的!只是我当时这么说!)
A:并行效率更高,在真正的多核机器上实现,
Q:现在流行的线程调度算法是什么?
A:时间片轮转法。
Q:可以在 Java 中设置线程的并发级别吗?
A:可以。
Q:这个并发级别可以对应到操作系统吗?
A:可以。
Q:如何把一个线程分配给指定的 CPU 呢?
A:不知道。
Q:这是一个开放性题,你再想想看?
A:(把其他 CPU 拔了)。
一个问题问完接着有下一个问题,最后可能会有开放性题,基本可以问到应试者不会为止。
所以大家准备知识的时候不要“浅尝辄止”,有些知识挖深一点可能更好。
================== 更新 ==================
晚上回来看看,已经800+收藏了。。。
评论中很多同学说难,应该是由我应试的岗位和面对的面试官决定的,不具备普适性。
这些知识点大多数都是很重要的,当然还有锁、集合、synchronized 等知识点面试官没问,我也很遗憾。面不过,主要问题还是在自己身上。
当然还有很多发散题,是用于考知识面的,是上面的知识点中没有的——比如面试官发现我做的B站爬虫的自动登录是需要输入验证码的,问我如何自动识别。。。如何自动识别。。。如何自动识别。。。我答的深度学习,举出 dl4j ,是没办法强答了,面试官说有图像识别算法。
================== 再更一次 ==================
大家的评论有些多,不能一一回复,我这里总的说一下吧,我是本科大三学生,实习应聘的是数据及产品部。
我的简历很平常,项目有用 netty 从零开始搭建服务器、普通 ssm 项目之类。
netty 百万级长连接是真的问了的,不过现在想想有很多方面是我当时没有答的,比如:
既然是长连接,如果场景像游戏那般,断线需要重登的话,那么不用自己维护一个 session map 了,可以用 Channel#attr()#set() 来实现类似功能;
静态资源可以提前用 unreleasable buffer(release() 方法永远返回 true,可以多次传输)准备好;
用 PooledByteBufAllocator ,netty 自己用 jemalloc 实现的的引用计数对象管理,不过这个是默认的,应该不算“优化”;
如果不对 io buffer 操作,优先考虑使用 direct buffer 等等等等。。。
我面试的时候居然都没想到,只答了 aio epoll 、少用状态 (Handler 可以 @Shared)、调整 bossGroup 和 workerGroup 还有业务线程池的线程数量(《并发编程实战》有公式可惜忘了)、调整这几种线程优先级。
其他同学写的阿里面经我也看了,异步与 Future (CompletableFuture)、 HashTable 与 ConcurrentHashMap 、volatile 与原子操作、JMM 、GC 为什么要分代、ArrayList 与 Vector 、synchronized 与 ReentrantLock ,然而我这边除了 HashMap 都没问到。
我是第一次被面试,也是第一次被拒,当然也不会是最后一次,下次面试的时候要尽量让面试官知道你会什么。
给面试官一点建议,一上来就问 netty 百万级长连接会“吓到我的” /(ㄒoㄒ)/~~。如果我问的话,会先问 eventloop handler 模型、request 与 channel 与 eventloop 的关系,接着问一下 ByteBuf 与 jdk ByteBuffer 的关系和区别,direct buffer 与 heap buffer 的优劣;也不要一开始就问 JVM GC 源码嘛,感觉自己学的那可怜的一丁点关于 GC 的知识直接被全盘否定,像面经那样问问为啥分代 gc 多友善。
================== 最后更一次 ==================
已经找到实习了哈,十分感谢推荐我的各位。
是啦是啦,我是本科大三,我的简历真的没写啥厉害的,别叫我大佬,担不起?。
评论和私信没想到这么多,这几天很少上知乎,不能一一回复,望谅解。
我对知识的爱好比较广泛,但没有在哪一方面挖得很深,是我的弱点,大家学习的时候可以“有偏向”地学。
ps. 没有找到实习的同学,请看评论区,应该能找到你想要的。