上接面试系列(一),本文讲述下第二家公司的面试,这是一家大型互联网公司,简称W,一般像当时笔者这样的传统行业去到这种公司一般是要跪舔的节奏,所以从一开始就带着一份敬仰之情去面试。由于和笔者不在一个城市,所以一面选择电面,二三面技术面去了公司face to face, 最后一面是HR面。这里HR面就略过,只讲述技术类相关的问题。
一面
一面约好14:00,果然14:00就来电话了,这点可以看出管理上还是很厉害的。
1.linux下怎么查看文件内容?
简单举例:cat tac more less head tail nl vi vim gvim
2.消息队列用什么作用?
笔者当时对消息队列的认知很少,只知道解耦,或者可以当数据冗余只用。预知更多详情可以自行百度,或者参考《RabbitMQ实战指南》~~
3.设计模式:说说一些常用的设计模式。
设计模式23种,分为创建型、组合型、行为型。 说了一些常用的:单例,适配器,工厂,装饰等。然后被问了一个问题:Java中的IO包含了那些设计模式?博主记不清是不是这家公司的面试题,姑且就算作是吧。比如Java中的IO用了两种设计模式,装饰模式和适配器模式,装饰模式比如BufferedInputStream, DataInputStream; 适配器的有InputStreamReader, OutputStreamWriter。
4.SpringMVC的分发过程?
5.Spring AOP和IOC的实现原理?
6.多线程的应用场景。这个就仁者见仁,智者见智随意聊咯。
7.对着简历问一下项目相关的知识点。在此就不表了。
二面和三面
二面和三面是face2face的。二面问了写Java基础。
1.线程池
就是ThreadPoolExecuotr,里面的各个参数解释一遍,包括什么饱和策略。然后工具类Executors中有哪些方法,包括:newFixedThreadPool, newSingleThreadExecutor, new CachedThreadPool以及Scheduled系列。
2.简述下JVM。
这个是个开放性的问题,考验你对JVM整体的理解。从Javac讲述到GC:
首先通过IDE编写完java程序之后,就要javac来编译成class文件,分为:词法分析,语法分析,语义分析,代码生成是个阶段,在语义分析阶段又可以分为:填充符号表、标注检查、数据流分析和控制流分析。标注检查比如定义int a=1+2,在这个阶段就会被解析成int a=3; 又比如在控制流分析阶段又去除语法糖的动作,类似foreach的解语法糖等。
其次,编译生成class文件之后,就需要JVM加载。加载涉及到一个双亲委派模型(parent delegation, 虽然大多习惯了这个称呼,但是心里要默念一遍这是单亲,"parent" is not "parents"),需要对双亲委派模型进行一下论述,以及为什么需要双亲委派模型(为了安全加载)。
类在加载之后就需要涉及验证-准备-解析-初始化的操作。
验证:目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。比如是否以魔数0xCAFEBABE开头。
准备:正式为类变量分配内存并设置类变量初始值的阶段。譬如public static int value=123;这时候赋值value为0.
解析:虚拟机将常量池内的符号引用转换为直接引用的过程。
初始化:这个阶段在上一篇讲过了,这里省略。
初始化之后就可以使用了,加载的类信息存入了运行时数据区的方法区,也就是俗称的永久代。运行时数据区分为:java堆,java栈,本地方法栈,方法区,pc寄存器。然后简单叙述下这些概念。
new一个对象需要在java堆中开辟内存,使用完之后就需要垃圾回收操作了,接下去要将GC了。
以Hot spot为例,java堆分为年轻代和老年代。通过GC Roots标记不可达内存对象进行回收处理。GC算法有:Mark-Sweep, Copying, Mark-Compact, 分代。接下去就论述垃圾收集器了。年轻代有Serial, ParNew, Parallel Scavenge等都是采用复制算法。老年代有Serial-Old, Parallel-Old, CMS。还有一个G1收集器。之后简单论述了一下CMS,CMS分为5个部分:初始标记,并发标记,重新标记,并发清除和并发重置,其中初始标记和重新标记是需要Stop the World的。CMS还有一个概念就是Concurrent Mode Failure,发生之后需要来一记Serial-Old的干活。
这个过程其实蛮长的,大概论述了将近20mins左右。
3.写出策略模式的UML图。
4.你对Java集合了解的怎么样?
笔者说Java集合的源码都看过,意思是随便问,然后被问了一个特别冷门的问题,这个问题在上一篇提及过,是Collections.sort()中使用了什么排序算法。幸亏看过,不要就要被活生生的打脸了。答案是:加强型归并排序,ComparableTimSort.(这里不只是有归并,还有其他算法,详细需要慢慢琢磨源码~)
有些知识点虽然平常很少触及,但是这也是非常重要的,这可以侧面反映出你的musle,比如一些:
● ThreadLocal什么情况下会发生内存泄露?
● WeakHashMap会发生内存泄露嚒?
● Doug Lea在写JUC的时候为什么喜欢使用for(;;)表示死循环而不是用while(true)?
● JDK中除了IO使用了装饰模式,其他什么地方还使用了装饰模式?(Collections.synchonizedMap, unchecked系列以及unmodifiable系列)
5.三面是部门领导,问了点项目相关的技术。这个具有特殊性所以就不表了。
总结
这份工作是猎头找我的,我看到W公司的名字欣然say: I wanna have a try. 但是后来一面完了之后,我也不知道我面的岗位是哪个。后来三面了才知道是做BI的,其是对这个工作不排斥也不喜欢。后来拿到offer也拒了,除了薪资低于预期之外,还有一个个人觉得很重要的一个东西,我当时站在W公司门口,包括在W公司边上转了一圈,I feel a bit homeless, 毕竟在这个城市认识的人可以用一只手数的过来,而且都在城市的另一边。感觉如果进了这家公司,每天只能像machine一样活着。毕竟这家公司出了名的996机制。W公司是我面完的第一家公司,但是当时还有10来家(有几家一面过了但是没去)一面都过了,让我去面试,所以在自信心上有所增强,觉得自己没有必要去跪舔了,有实力去find a better job,所以在收到offer之时当场就拒了。