这里有一份面筋请查收(二)
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理》和《RabbitMQ實(shí)戰(zhàn)指南》,同時(shí)歡迎關(guān)注筆者的微信公眾號(hào):朱小廝的博客。
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/talk/interview-2/
這里講述下第二家公司的面試,這是一家大型互聯(lián)網(wǎng)公司,簡(jiǎn)稱(chēng)W,一般像博主這樣的傳統(tǒng)行業(yè)去跳到這種公司簡(jiǎn)直是要跪舔的節(jié)奏,所以從一開(kāi)始就帶著一份敬仰之情去面試。由于和博主不在一個(gè)城市,所以一面選擇電面,二三面技術(shù)面去了公司face to face, 最后一面是HR面。這里HR面就略過(guò),只講述技術(shù)類(lèi)相關(guān)的問(wèn)題。
###一面
一面約好14:00,果然14:00就來(lái)電話(huà)了,這點(diǎn)可以看出管理上還是很厲害的。
1.linux下怎么查看文件內(nèi)容?
如果看過(guò)前面一篇的小伙伴是不是已經(jīng)知道答案了:cat tac more less head tail nl vi vim gvim
2.消息隊(duì)列用什么作用?
博主只知道解耦,或者可以當(dāng)數(shù)據(jù)冗余只用。后來(lái)查閱了一下,原來(lái)消息隊(duì)列有這么多功效:解耦、容易、擴(kuò)展性(增大消息入隊(duì)和處理的頻率是很容易的)、靈活性和峰值處理能力、排序、緩沖、送達(dá)保證(消息隊(duì)列提供的冗余機(jī)制保證了消息能夠被實(shí)際的處理,只要一個(gè)進(jìn)程讀取了該隊(duì)列即可);異步通訊。
3.設(shè)計(jì)模式:說(shuō)說(shuō)一些常用的設(shè)計(jì)模式。
設(shè)計(jì)模式23種,分為創(chuàng)建型、組合型、行為型。
說(shuō)了一些常用的:單例,適配器,工廠(chǎng),裝飾等。然后被問(wèn)了一個(gè)問(wèn)題:Java中的IO包含了那些設(shè)計(jì)模式?博主記不清是不是這家公司的面試題,姑且就算作是吧。拒博主所知,Java中的IO用了兩種設(shè)計(jì)模式,裝飾模式和適配器模式,裝飾模式比如BufferedInputStream, DataInputStream; 適配器的有InputStreamReader, OutputStreamWriter。
4.SpringMVC的分發(fā)過(guò)程?
具體指DispatcherServlet怎么運(yùn)作的原理圖,可以參考《Spring知識(shí)點(diǎn)提煉》,包括二面也讓我畫(huà)了一個(gè)這個(gè)圖。
5.Spring AOP和IOC的實(shí)現(xiàn)原理? 分別是動(dòng)態(tài)代理和反射
6.多線(xiàn)程的應(yīng)用場(chǎng)景。這個(gè)就仁者見(jiàn)仁,智者見(jiàn)智隨意聊咯。
7.對(duì)著簡(jiǎn)歷問(wèn)一下項(xiàng)目相關(guān)的知識(shí)點(diǎn)。在此就不表了。
###二面和三面
二面和三面是face2face的。二面問(wèn)了寫(xiě)Java基礎(chǔ)。
1.線(xiàn)程池
就是ThreadPoolExecuotr,里面的各個(gè)參數(shù)解釋一遍,包括什么飽和策略。然后工具類(lèi)Executors中有哪些方法,包括:newFixedThreadPool, newSingleThreadExecutor, new CachedThreadPool以及Scheduled系列。
2.簡(jiǎn)述下JVM。
這個(gè)是個(gè)開(kāi)放性的問(wèn)題,考驗(yàn)?zāi)銓?duì)JVM整體的理解。從Javac講述到GC:
首先通過(guò)IDE編寫(xiě)完java程序之后,就要javac來(lái)編譯成class文件,分為:詞法分析,語(yǔ)法分析,語(yǔ)義分析,代碼生成是個(gè)階段,在語(yǔ)義分析階段又可以分為:填充符號(hào)表、標(biāo)注檢查、數(shù)據(jù)流分析和控制流分析。標(biāo)注檢查比如定義int a=1+2,在這個(gè)階段就會(huì)被解析成int a=3; 又比如在控制流分析階段又去除語(yǔ)法糖的動(dòng)作,類(lèi)似foreach的解語(yǔ)法糖等。
其次,編譯生成class文件之后,就需要JVM加載。加載涉及到一個(gè)雙親委派模型,需要對(duì)雙親委派模型進(jìn)行一下論述,以及為什么需要雙親委派模型(為了安全加載)。
類(lèi)在加載之后就需要涉及驗(yàn)證-準(zhǔn)備-解析-初始化的操作。
驗(yàn)證:目的是為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全。比如是否以魔數(shù)0xCAFEBABE開(kāi)頭。
準(zhǔn)備:正式為類(lèi)變量分配內(nèi)存并設(shè)置類(lèi)變量初始值的階段。譬如public static int value=123;這時(shí)候賦值value為0.
解析:虛擬機(jī)將常量池內(nèi)的符號(hào)引用轉(zhuǎn)換為直接引用的過(guò)程。
初始化:這個(gè)階段在上一篇講過(guò)了,一定要突出這個(gè)知識(shí)點(diǎn):虛擬機(jī)規(guī)范嚴(yán)格規(guī)定了有且只有5種情況(JDK7)必須對(duì)類(lèi)進(jìn)行初始化(執(zhí)行類(lèi)構(gòu)造器<clinit>()方法):
初始化之后就可以使用了,加載的類(lèi)信息存入了運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū),也就是俗稱(chēng)的永久代。運(yùn)行時(shí)數(shù)據(jù)區(qū)分為:java堆,java棧,本地方法棧,方法區(qū),pc寄存器。然后簡(jiǎn)單敘述下這些概念。
new一個(gè)對(duì)象需要在java堆中開(kāi)辟內(nèi)存,使用完之后就需要垃圾回收操作了,接下去要將GC了。
以Hot spot為例,java堆分為年輕代和老年代。通過(guò)GC Roots標(biāo)記不可達(dá)內(nèi)存對(duì)象進(jìn)行回收處理。GC算法有:Mark-Sweep, Copying, Mark-Compact, 分代。接下去就論述垃圾收集器了。年輕代有Serial, ParNew, Parallel Scavenge等都是采用復(fù)制算法。老年代有Serial-Old, Parallel-Old, CMS。還有一個(gè)G1收集器。一般互聯(lián)網(wǎng)公司喜歡采用CMS,然后就論述了一下CMS,CMS分為5個(gè)部分:初始標(biāo)記,并發(fā)標(biāo)記,重新標(biāo)記,并發(fā)清除和并發(fā)重置,其中初始標(biāo)記和重新標(biāo)記是需要Stop the World的。CMS還有一個(gè)概念就是Concurrent Mode Failure,發(fā)生之后需要來(lái)一記Serial-Old的干活。
這個(gè)過(guò)程其實(shí)蠻長(zhǎng)的,大概論述了將近20mins左右。
3.寫(xiě)出策略模式的UML圖。
可以參考《設(shè)計(jì)模式:適配器模式(Adapter)》
4.你對(duì)Java集合了解的怎么樣?
博主說(shuō)Java集合的源碼都看過(guò),意思是隨便問(wèn),然后被問(wèn)了一個(gè)特別冷門(mén)的問(wèn)題,這個(gè)問(wèn)題在上一篇提及過(guò),是Collections.sort()中使用了什么排序算法。幸虧博主看過(guò),不要就要被活生生的打臉了。答案是:加強(qiáng)型歸并排序,ComparableTimSort.(這里不只是有歸并,還有其他算法,詳細(xì)需要慢慢琢磨源碼~)
這里還是強(qiáng)調(diào)一下冷知識(shí)的重要性,一般特別偏的知識(shí)都知道的話(huà),其他的知識(shí)其實(shí)是默認(rèn)掌握了的。博主這里在講幾個(gè)冷知識(shí):
- ThreadLocal什么情況下會(huì)發(fā)生內(nèi)存泄露?(一個(gè)朋友也是在這家公司被問(wèn)過(guò)這個(gè)問(wèn)題)(線(xiàn)程池)
- WeakHashMap會(huì)發(fā)生內(nèi)存泄露嚒?(key==null)
- Doug Lea在寫(xiě)JUC的時(shí)候?yàn)槭裁聪矚g使用for(;;)表示死循環(huán)而不是用while(true)?(情懷)
- JDK中除了IO使用了裝飾模式,其他什么地方還使用了裝飾模式?(Collections.synchonizedMap, unchecked系列以及unmodifiable系列)
5.三面是部門(mén)領(lǐng)導(dǎo),問(wèn)了點(diǎn)項(xiàng)目相關(guān)的技術(shù)。這個(gè)具有特殊性所以就不表了。
###總結(jié)
這份工作是獵頭找我的,我看到W公司的名字欣然say: I wanna have a try. 但是后來(lái)一面完了之后,我也不知道我面的崗位是哪個(gè)。后來(lái)三面了才知道是做BI的,其是對(duì)這個(gè)工作不排斥也不喜歡。后來(lái)拿到offer也拒了,除了薪資低于預(yù)期之外,還有一個(gè)博主覺(jué)得很重要的一個(gè)東西,博主站在W公司門(mén)口,包括在W公司邊上轉(zhuǎn)了一圈,I feel a bit homeless, 畢竟在這個(gè)城市認(rèn)識(shí)的人可以用一只手?jǐn)?shù)的過(guò)來(lái),而且都在城市的另一邊。感覺(jué)如果進(jìn)了這家公司,每天只能像machine一樣活著。畢竟這家公司出了名的996機(jī)制。W公司是博主面完的第一家公司,但是博主當(dāng)時(shí)一共投了8家(有2家一面面完就不想去了。。。)一面都過(guò)了,讓我去面試,所以在自信心上有所增強(qiáng),覺(jué)得自己沒(méi)有必要去跪舔了,有實(shí)力去find a better job,所以在收到offer之時(shí)就拒了。
更多鏈接請(qǐng)關(guān)注:
這里有一份面筋請(qǐng)查收(一)
這里有一份面筋請(qǐng)查收(二)
這里有一份面筋請(qǐng)查收(三)
這里有一份面筋請(qǐng)查收(四)
這里有一份面筋請(qǐng)查收(五)
這里有一份面筋請(qǐng)查收(六)
這里有一份面筋請(qǐng)查收(七)
這里有一份面筋請(qǐng)查收(八)
參考資料
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/talk/interview-2/
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理》和《RabbitMQ實(shí)戰(zhàn)指南》,同時(shí)歡迎關(guān)注筆者的微信公眾號(hào):朱小廝的博客。
總結(jié)
以上是生活随笔為你收集整理的这里有一份面筋请查收(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 聊一聊ThreadLocal
- 下一篇: 这里有一份面筋请查收(五)