蚂蚁金服面试及笔试(附自己的答案)
本次進行了一輪筆試,然后進行一面,預計一面掛了,自我感覺答得很凌亂,雖然問的基本都會。面試除了心態,還有就是充分的準備,后續多多總結關注細節吧。以下是后續整理的簡要面試提問:
1.自我介紹
1.自我簡介:畢業于西電,就職于xx廠,負責Java后臺研發
2.項目簡介及技術選型:項目,出發點及功能,技術選型:框架用的是spring boot,數據庫是mysql,持久層框架是mybatis,也在之前的項目用過jpa,jpa是一種規范,mybatis是一種具體實現,無所謂孰優孰劣,看具體場景。客戶端和服務端消息交互的語音交互部分,為了節省效率,選擇的是全雙工的websocket,其他交互則是http的rest接口為主。引進了第三方的消息交互組件activeMq,是為了解耦和異步(第三種優點是削峰,不過本項目主要是為了解耦和異步)。為了解決海量數據的存儲問題,引入了fdfs組件。本產品在部署上可分為單機和集群部署,在客戶的使用需求比較小的情況下,則使用單機模式。當客戶群體比較大則服務考慮集群模式,集群模式引入了sping cloud里的Eureka和config,配置文件托管在服務器上的git倉庫。在內部多文件處理上為了并發節省效率,使用了多線程,使用的是定長線程池。為了便于全文檢索,引入了Elasticsearch。為了對應的數據收集分析需求,還在對應的邏輯處進行埋點,以便后續運維人員對產品的各項指標把控。在功能開發完成后,配合測試人員,進行版本的冒煙、性能測和穩定性測試。版本發往現場使用后,對現場運維人員反饋的問題,進行跟蹤和排查解決。
2.多線程,關鍵字threadlocal
1.多線程使用場景: cpu利用效率更好以及響應更快。我在項目中使用的是定長線程池,因為線程是稀缺資源,如果被無限創建,則不僅消耗系統資源,還有害于系統穩定性。利用線程池,則可對線程進行相應管理,提高響應速度以及降低資源消耗。
2.threadlocal:線程局部變量,即threadlocal為每個線程創建個變量副本,那么每個線程便訪問自己的變量副本。線程變量副本存儲位置是在線程的ThreadLocalMap里。它的主要應用場景是為了解決數據庫連接和session管理的。
3.synchronized原理
1.synchronized是可修飾代碼塊、方法、對象以及類的悲觀鎖。
2.原理:在jdk1.6之前是利用了monitor對象來完成,每個對象都有個監視器鎖,當Monitor被占用時就會處于鎖定狀態,線程執行monitorenter時會嘗試進入監視器,如果monitor的進入數為0.則該線程進入monitor,且將進入數設置為1,獲取有monitor的線程重復進入,則相應加一減一。其他線程嘗試進入時,就會阻塞,直到monitor為0,則可獲取monitor的進入權。在jdk1.6及之后,為了減少獲得鎖和釋放鎖帶來的性能損耗,提高使用效率,引入了偏向鎖和輕量級鎖。鎖可從偏向鎖升級到輕量級鎖,再從輕量級鎖,升級到重量級鎖,這個鎖的升級是單向過程。
輕量級鎖,引入的本意是為了,在沒有多線程競爭的條件下,減少重量級鎖所帶來的損耗。輕量級鎖的使用場景是:多個線程交替執行同步塊的情況。如果在同一時間有多個線程同時訪問同步塊,則輕量級鎖就會膨脹為重量級鎖。
偏向鎖,引入的本意是為了減少不必要的輕量級鎖執行路徑,因為輕量級鎖的獲取與釋放依賴多次CAS原子指令。而偏向鎖,只在置換ThreadId時依賴一次CAS原子指令。相對于輕量級鎖適用于多線程交替執行同步塊的使用場景。偏向鎖的使用場景則是,單線程訪問同步塊時進一步提高性能。
更深入了解,可移步1.Java并發編程:Synchronized及其實現原理
2.Java并發編程:Synchronized底層優化(偏向鎖、輕量級鎖)
4.volitile作用
1.保證變量對所有線程的可見性。對變量的修改,會實時同步到主內存,變量的讀,也是從主內存去讀。
2.禁止被修飾 的前后代碼指令重排序優化。
詳情可移步Java并發編程:volatile關鍵字解析
5.JVM內存構造,垃圾回收機制。常量所在位置,不同版本jdk有什么區別;full gc的垃圾回收算法,及原理,標記-清理算法如何標記的,如何判斷是否被引用。
內存構造:堆、虛擬機棧、方法區、本地方法棧以及程序計數器。
JVM垃圾回收機制:標記清理算法、標記壓縮算法以及分代回收算法。
常量所在位置,根據jdk版本不同而不同,jdk1.7之前是在方法區的常量池,jdk1.7被移到堆的永久代里。jdk1.8時還是在堆里,不過永久代被元空間取而代之,常量池位置并沒變化。
full gc 的垃圾回收算法:標記清理算法和標記壓縮算法。標記清理,通過遍歷所有的Gc Roots,然后將所有Gc Roots可達對象標記為存活對象,將沒有標記的對象清除掉。
6.正則表達式使用(這個問題感覺就是面試官根據簡歷隨口問的。當時有點懵,項目用過幾次,主要用做字符串匹配)
正則表達式的三個使用場景:
1.匹配
2.切割
3.替換
7.spring boot 和spring框架的區別,spring boot用的時候踩到的坑
spring boot 是在spring的基礎上,搭建的全新的微服務框架,目的是簡化spring的搭建和開發過程,其優點如下:
1.可快速構建項目
2.對主流開發框架的無配置繼承
3.項目可獨立運行,無需依賴外部servlet容器
4.提供運行時的應用監控
5.無需配置復雜的 xml
缺點:
1.資料較少且不夠深入。
2.集成度太高,不太容易了解底層。
8.hashmap的底層實現原理
這是個老生常談的問題,基本十次面試有九次問。還是得好好縷清楚。
底層實現原理:數組+鏈表,其主干是Entry數組,包含key-value鍵值對。數組是hashmap的主體,鏈表是為了解決哈希沖突。對于查找和添加而言,若定位到位置不含鏈表,則查找很快,僅需一次尋址即可。如果含有鏈表,則遍歷鏈表,存在即覆蓋,否則新增。對于查找而言,則需要遍歷鏈表,依次通過對key對象的equals方法進行逐一對比查找。就性能考慮,鏈表越少越好。
關于不同版本的hashmap差異:在jdk1.7及之前,是數組+鏈表。在jdk8,也是數組+鏈表,不過對鏈表處進行了優化,若鏈表長度大于8,則將鏈表轉為紅黑樹。
想了解更多的話可移步HashMap實現原理及源碼分析
9.jstack、jmap及jstat
1.jstack查看服務線程,常用用法:jstack pid
2.jmap查看服務內存,常用用法:jmap pid 或jmap -histo pid 以及把內存dump到二進制文件中,用mat分析。(命令格式:jmap -dump:format=b,file=heap.bin pid)
3.jstat 實時監控資源和性能,常用用法;jstat -gc pid ,統計gc時的heap信息
更多詳情可移步tack(查看線程)、jmap(查看內存)和jstat(性能分析)命令
ps:非面試部分及附加筆試題和自己的筆試答案,僅供參考,如有不同見解,歡迎溝通交流
在線筆試部分,兩道題,限時40分鐘解答。
題目一:
現需做一個部門管理功能,如公司有多個大部門A、B、C…,每個部門下面有多個子部門,子部門還有子部門以此類推,如部門A下面有部門AB、AC、AD,部門AB下面有AE、AF,部門AC下面有AG、AH、AI,部門AE下面有AJ等,每個部門的子部門個數和部門的層數均為無限,每個部門的父部門要么沒有要么是一個。 針對上述需求完成如下題目:
1,設計表結構存儲上述部門關系;
2,定義領域模型Department類;
3,實現刪除部門方法:void delete(Integer departmentId),要求刪除指定部門的同時刪除其下面的所有層級的子部門,如刪除部門AB的同時要刪除它的子部門AE、AF和AE的子部門AJ;
題目二:
設計一個棧,這個棧除了支持普通的push, pop操作之外,還提供一個函數min(), 以返回棧中元素的最小值,要求min()的時間復雜性為O(1).
提示:可以用現有的任何數據結構,如隊列、隊、另外的棧,等等。 優化:要求實現push(), pop()的時間復雜性也為O(1)
總結
以上是生活随笔為你收集整理的蚂蚁金服面试及笔试(附自己的答案)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: setfocus属性
- 下一篇: TCGA差异表达分析|2022.5.1更