这里有一份面筋请查收(八)
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/talk/interview-8/
本篇是這個系列的最后一篇了,寫完這篇就準備離職的相關事情了。這里講述的是公司簡稱為A, 是8家面試中唯一掛掉的一家。面試分為4輪,兩輪技術,后面兩輪應該是BOSS+HR面。HR具有一票否決權。博主只面到2面,就只講講這兩面面了什么吧。
###一面
和其他面試差不多,主要是先針對簡歷上的內容問一番,然后問點Java基礎的問題。(共70mins)
CMS什么情況下回發生Serial-Old的操作?
CMS收集器無法處理浮動垃圾,可能出現“Concurrent Mode Failure“,失敗后而導致另一次Full GC的產生。由于CMS并發清理階段用戶線程還在運行,伴隨程序的運行自熱會有新的垃圾不斷產生,這一部分垃圾出現在標記過程之后,CMS無法在本次收集中處理它們,只好留待下一次GC時將其清理掉。這一部分垃圾稱為“浮動垃圾”。也是由于在垃圾收集階段用戶線程還需要運行,即需要預留足夠的內存空間給用戶線程使用,因此CMS收集器不能像其他收集器那樣等到老年代幾乎完全被填滿了再進行收集,需要預留一部分內存空間提供并發收集時的程序運作使用。在默認設置下,CMS收集器在老年代使用了68%的空間時就會被激活,也可以通過參數-XX:CMSInitiatingOccupancyFraction的值來提供觸發百分比,以降低內存回收次數提高性能。要是CMS運行期間預留的內存無法滿足程序其他線程需要,就會出現“Concurrent Mode Failure”失敗,這時候虛擬機將啟動后備預案:臨時啟用Serial Old收集器來重新進行老年代的垃圾收集,這樣停頓時間就很長了。所以說參數-XX:CMSInitiatingOccupancyFraction設置的過高將會很容易導致“Concurrent Mode Failure”失敗,性能反而降低。
2.Java集合相關
能講述的都講述了一遍。
Map系:HashMap, LinkedHashMap, TreeMap,WeakHashMap
Set系:HashSet, TreeSet, LinkedHashSet
List系:ArrayList, LinkedList
工具類:Collections, Arrays.
HashMap:初始容量為16,加載因子為0.75。主要是hashCode()和equals()兩個方法。Fast-Fail. HashMap在多線程環境下put會引起鏈路環從而造成死循環。通過鏈地址法來解決Hash沖突。有關Hash算法可以參考《Hash算法》。HashMap的擴容。附加:為什么加載因子在設置在0-1之間?
LinkedHashMap:繼承了HashMap,內部采用Hash表和鏈表實現,并且依靠著雙向鏈表保證了迭代順序是插入的順序。非線程安全。LinkedHashMap中有一個protected的方法:removeEldestEntry(),實現這個方法可以產生一些耐人尋味的事情(詳細請參考《Java集合框架:LinkedHashMap》)。LinkedHashMap號稱是最占內存的數據結構。支持iterator()時按Entry的插入順序來排序(但是更新不算,如果設置accessOrder屬性為true, 則所有讀寫訪問都算)。實現上是Entry上再增加屬性before/after指針,插入時把自己加到Header Entry的前面去。如果所有讀寫訪問都要排序,還要把前后Entry的before/after拼接起來以在鏈表中刪除掉自己。附加:怎么用LinkedHashMap實現LRU?
WeakHashMap: 對比HashMap的源碼,發現WeakHashMap中的方法的實現方式基本和HashMap的一樣,注意“基本”兩個字,除了沒有實現Cloneable和Serializable這兩個標記, 最大的區別在于expungeStaleEntries()這個方法,這個是整個WeakHashMap的精髓。WeakHashMap使用弱引用作為內部數據的存儲方案。如果存放在WeakHashMap中的key都存在強引用,那么WeakHashMap就會退化成HashMap。如果在系統中希望通過WeakHashMap自動清除數據,請盡量不要在系統的其他地方強引用WeakHashMap的key,否則,這些key就不會回收,WeakHashMap也就無法正常釋放它們所占用的表項。附加:WeakHashMap的應用場景?WeakHashMap什么情況下會發生內存泄漏?
TreeMap:TreeMap時用鍵來進行升序排序的。通過Comparable或Comparator來排序。TreeMap 是SortedMap接口的基于紅黑樹的實現。鍵不可以為null(這點和其他Map不同,如果比較器對null進行了處理,就可以為null),但是值可以為null。TreeMap對containsKey, get, put和remove操作提供了保證的log(n)的時間開銷。
Set系的內部實現都是對應的Map,無太多亮點,只是保證元素不重復。
剩下的前面的文章也陳述過多次了,更多詳細內容可以參考《Java集合框架:總結》。
3.怎么設計hashCode?比如String的hashCode為什么乘以31這樣一個素數而不是一個偶數?
4.memcached和redis的區別?
參考:Redis和Memcached的區別
5.類初始化過程?
編譯生成class文件之后,就需要JVM加載。加載涉及到一個雙親委派模型,需要對雙親委派模型進行一下論述,以及為什么需要雙親委派模型(為了安全加載)。
類在加載之后就需要涉及驗證-準備-解析-初始化的操作。
驗證:目的是為了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。比如是否以魔數0xCAFEBABE開頭。
準備:正式為類變量分配內存并設置類變量初始值的階段。譬如public static int value=123;這時候賦值value為0.
解析:虛擬機將常量池內的符號引用轉換為直接引用的過程。
初始化:這個階段在前面的好幾篇都講過了,一定要突出這個知識點:虛擬機規范嚴格規定了有且只有5種情況(JDK7)必須對類進行初始化(執行類構造器()方法):
遇到new,getstatic,putstatic,invokestatic這失調字節碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。生成這4條指令的最常見的Java代碼場景是:使用new關鍵字實例化對象的時候、讀取或設置一個類的靜態字段(被final修飾、已在編譯器把結果放入常量池的靜態字段除外)的時候,以及調用一個類的靜態方法的時候。
使用java.lang.reflect包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化。
當初始化一個類的時候,如果發現其父類還沒有進行過初始化,則需要先觸發其父類的初始化。
當虛擬機啟動時,用戶需要指定一個要執行的主類(包含main()方法的那個類),虛擬機會先初始化這個主類。
當使用jdk1.7動態語言支持時,如果一個java.lang.invoke.MethodHandle實例最后的解析結果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且這個方法句柄所對應的類沒有進行初始化,則需要先出觸發其初始化。
6.Keeaplived+LVS的內部實現原理?
博主簡歷上寫用過這兩個東西,所以被問原理也很正常。
Keepalived是以VRRP協議為實現基礎的,主要有三個模塊,分別是core,check和vrrp。core是keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。工作在3,4,7層上。第三層:Keepalived會定期向服務器集群中的服務器發送一個ICMP的數據包,如果發現某臺服務器的IP地址沒有激活,Keepalived便報告這臺服務器失效。并將它從服務器集群中提出。第四層:主要以TCP端口的狀態來決定服務器工作正常與否。第7層:根據用戶的設定檢查服務器程序的運行是否正常,如果與用戶的設定不相符,則Keepalived將把服務器從服務器群中剔除。
7.常用的JDK類?
這個問題太開放了,注意要回答自己特別熟悉的,不然就要歇逼。
8.用過哪些框架? 不知道原理的不要說。
###二面
二面喜歡抓著一個問題問到死。一共問了45mins左右。
比如HashMap怎么解決Hash沖突?hashCode,equals,鏈地址法來一遍。還有沒有其他的解決Hash沖突的方法?那么當有很多hashCode為0的情況下怎么解決?我就喜歡寫死hashCode0你怎么解決?hashCode0的有好幾萬個你怎么解決?我這個集合里還有好幾十萬個hashCode不等于0的怎么解決? 我就不想用這種方法解決你怎么解決?
類似這樣的問題串問了幾個。
我只能說:感謝給了這次面試機會~
###后續
A公司面試掛了還可以繼續重新開始面試另一個崗位, 只要你有精力可以一直面。對比一下手中的offer: A公司的薪資并不誘人,職位也并不誘人,唯一誘人的只有這塊金字招牌了。再鑒于二面的這種面試方式(這個分人的,每個面試官的面試風格不一樣),也沒有太多的意愿再面幾次了。到此止步。
這里補充一下,基本上面試結束前會問一些問題,類似:
最好準備下,千萬不要瞎答。
更多鏈接請關注:
這里有一份面筋請查收(一)
這里有一份面筋請查收(二)
這里有一份面筋請查收(三)
這里有一份面筋請查收(四)
這里有一份面筋請查收(五)
這里有一份面筋請查收(六)
這里有一份面筋請查收(七)
這里有一份面筋請查收(八)
參考資料
歡迎跳轉到本文的原文鏈接:https://honeypps.com/talk/interview-8/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的这里有一份面筋请查收(八)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这里有一份面筋请查收(七)
- 下一篇: Linux(CentOS)中常用软件安装