天天看點

這裡有一份面筋請查收(三)

經過前面兩次的面試,這裡就馬上轉到第三家公司了的面試了,這裡簡稱B,工作地點和上一篇所講述的W公司在一個城市,是面完W之後第二天去的,說出名字的話大多小夥伴都聽過或者用過其服務,具體是什麼要靠你們的悟性了。

B公司的一面也是電面,主要是根據履歷上的聊了一下,問了幾個問題。挑兩個比較有通用性的問題聊一下。

1. 了解Spring架構多少?

之後又被問了個問題:大家都知道BeanFactory是什麼,那麼你了不了解FactoryBean呢?這個見過,但是真記不得幹嘛用的,後來翻看了下資料:一般情況下,Spring通過反射機制利用bean的class屬性指定實作類來執行個體化Bean。在某些情況下,執行個體化bean過程比較複雜,如果按照傳統的方式,則需要在<bean>中提供大量的配置資訊,配置方式的靈活性是受限的,這時采用編碼的方式可能會得到一個簡單的方案,Spring為此提供了一個org.Springframework.bean.factory.FactoryBean的工廠類接口,使用者可以通過實作該接口定制執行個體化bean的邏輯。

2.ArrayList的問題。

有關ArrayList無非就是一下一些基本認知:非線程安全,初始容量為10,按照1.5倍擴容,底層采用數組elementData實作,對于随機通路get和set效率比較高,對于add和remove效率比LinkedList要低。當要擴容時采用System.arrayCopy()這個native方法實作。

但是ArrayList有兩個點需要注意的。

第一個是ArrayList有個trimToSize()方法用來縮小elementData數組的大小,這樣可以節約記憶體。考慮這樣一種情形,當某個應用需要,一個ArrayList擴容到比如size=10000,之後經過一系列remove操作size=15,在後面的很長一段時間内這個ArrayList的size一直保持在<100以内,那麼就造成了很大的空間浪費,這時候建議顯式調用一下trimToSize()這個方法,以優化一下記憶體空間。或者在一個ArrayList中的容量已經固定,但是由于之前每次擴容都擴充50%,是以有一定的空間浪費,可以調用trimToSize()消除這些空間上的浪費。

第二個是ArrayList中有個不合理之處,就是ArrayList是implements RandomAccess這個接口的。關于RandomAccess接口JDK中有明确定義:實作了RandomAccess接口的集合架構,采用疊代器周遊比較慢,不推薦。 原文是這麼說的:

3.流控怎麼處理?

直接丢棄;本機記憶體暫存一些請求,比如用Semaphore實作;消息隊列。最後面試官提示了一個令牌算法。

4.Linux的常用指令?

這個在第一篇中也陳述過了:

二面本來是兩個面試官,一個面試官(是一面的面試官)在紙上畫了個數就接個電話出去了,剩下的是另一個面試官。整個過程持續1個半小時左右,過程是邊面邊在紙上寫。這種方式有點“虐”,不過還好問的比較全面,也不是特别的深。面試官人不錯,面試過程也很和諧。題目還蠻多的,部落客盡量回憶一下。

1.根據紙上畫的樹(多叉樹,并不是二叉樹)寫出一個樹的實作,用Java。然後寫出樹的周遊方式,遞歸和非遞歸方式都要寫。然後是寫出樹的前序,中序,後序周遊的結果。

遞歸的周遊比較簡單,非遞歸的方式是采用棧進行操作。至于前序,中序,後序周遊隻要懂點資料結構和算法的人都能知道,在此不贅述了。

2. JVM調優。

主要是講講自己實際遇到的情況。比如調節一下參數,類似:-Xmx, -Xms等;又比如采用JConsole或者JVisualVm進行操作;又比如用jps, jmap, jstack等指令工具。

接着再講講遇到OOM的時候是怎麼處理的。

3.剛剛講述了OOM也就是記憶體吃不住的時候怎麼處理,如果某個線程CPU占用率100%怎麼檢視。

這個部落客直說出了用資源管理工具檢視,或者linux的top指令檢視一個程序的CPU占用率,至于某個線程的占用率怎麼檢視還真不知道。

後面面試官說可以這麼使用,先jstack查出線程堆的資訊,在用top H -p [pid]的方式檢視某個線程占用率(pid 通過jps指令擷取),中間進過16進制轉換下就對應起來了。回家試了下,還真是。還有一種方法也可以,在linux下:ps -H -eo pid,ppid,tid,%cpu –sort=%cpu | grep [pid]也有同樣的效果。

4.寫一個單例

5.聊了聊多線程。CAS等

多線程一般聊了聊ThreadPoolExecutor相關的,或者ConcurrentHashMap, 或者BlockingQueue系列的。CAS就寫了一個CAS的實作方式,Java中的CAS的底層實作隻有三個:sun.misc.Unsafe.CompareAndSwapInt, CompareAndSwapLong, CompareAndSwapObject.

6.畫出volatile的記憶體模型。

這個題目比較吓人,如果看過的人很容易就畫出來了。volatile就兩點:記憶體可見性;原子性。

7.畫出TCP三向交握,四次揮手。(略)

8.動态代理。

說實話,這家公司挺好的,也在穩步上升階段。上班可以從10點開始,面試官人不錯,感覺秒秒鐘就能做好朋友的那種。隻是部落客這次出來轉一轉是有目的性的,需要找一家有點名氣的網際網路公司,有一個必須點是必須要有足夠的流量接入。B公司的網際網路産品主要面對商戶,是以流量上并沒有那麼的大。薪資其實給的也不錯,如果B公司與部落客同城,部落客肯定就選擇了。隻是要換個城市,這份offer的誘惑力就沒有那麼大了,最終還是沒有選擇。最後在這裡感謝下背後運作的獵頭Theresa, 雖然我也知道你不會看我部落格,你真的比其他的獵人負責任多了,抱歉沒能給你賺一單業績~

更多連結請關注:

<a href="http://blog.csdn.net/u013256816/article/details/51780920">這裡有一份面筋請查收(一)</a>

<a href="http://blog.csdn.net/u013256816/article/details/51787470">這裡有一份面筋請查收(二)</a>

<a href="http://blog.csdn.net/u013256816/article/details/51793563">這裡有一份面筋請查收(三)</a>

<a href="http://blog.csdn.net/u013256816/article/details/51803945">這裡有一份面筋請查收(四)</a>

<a href="http://blog.csdn.net/u013256816/article/details/51812891">這裡有一份面筋請查收(五)</a>

<a href="http://blog.csdn.net/u013256816/article/details/51823211">這裡有一份面筋請查收(六)</a>

<a href="http://blog.csdn.net/u013256816/article/details/51835169">這裡有一份面筋請查收(七)</a>

<a href="http://blog.csdn.net/u013256816/article/details/51842329">這裡有一份面筋請查收(八)</a>

參考資料: