2019秋招百度與阿里二面面經難點總結2(後續)

10.怎麼判斷哪些對象是垃圾

(1)引用計數法

原理: 給每一個對象添加一個引用計數器,每當有一個地方引用它時,就將引用計數器加1.當引用失效時就將其減去1. 任何時刻引用計數器的值如果等於零,那麼就判定對象是可以回收的。優點:實現簡單,判斷效率高,在大部分情況下他都是一個很不錯的算法。python語言就是使用這個算法進行垃圾判定的。引用計數器法被廣泛用於進行內存管理;。

缺陷: 至於主流的java虛擬機(java語言以及C#語言)都沒有選擇使用引用計算數法來進行判定回收對象和管理內存,其中最主要的原因就是其無法處理特殊的情況也就是對象之間進行循環引用問題(例如AB,BA問題),也就是兩個對象互相引用着對方,因此他們兩個的引用計算器的值都不爲零。於是引用計算法就遇到了困難,無法通知GC垃圾回收器回收他們。

(2)可達性分析算法

概述:商業性的開發語言Java以及C#語言都是通過可達性分析算法來判斷對象是否存活。這個方法就是通過一系列的GC-Roots的對象作爲起始點。然後我們從這些節點開始向下搜索,搜索走過的路徑就是就叫做引用鏈。當一個對象到GC-Roots沒有任何引用鏈(用圖論的話說就是從GC-Roots到這個對象不可達)時,就證明此對象是不可用的。即使幾個引用之間存在關聯關係但是,但是他們到GC-Roots是不可達的,所以他們將會被判定爲是可回收的對象。

(3)GC-Roots對象包括以下幾種:

1.虛擬機棧(棧幀中的本地變量表)中引用的對象。

2.方法區中類靜態屬性引用的對象。

3.方法區中常量引用的對象。

4.本地方棧中的JNI(一般是native方法(本地方法))引用的對象

11.用過oracle嗎,比較一下MySQL和Oracle吧

區別:

Oracle 是基於用戶的,通過用戶去標識數據庫,每個數據庫中有一些表。

MySQL一個用戶可以有多個庫,每個庫有很多表。Oracle和MySQL的SQL語法有區別,Oracle總體來說語法比較嚴格,而且它沒有limit的關鍵字,分頁較爲麻煩。

初此之外它們的默認隔離級別不同,Oracle時讀已提交,MySQL是可重複讀。

12.創建線程池有哪幾種方式?

①. newFixedThreadPool(int nThreads) 創建一個固定長度的線程池,每當提交一個任務就創建一個線程,直到達到線程池的最大數量,這時線程規模將不再變化,當線程發生未預期的錯誤而結束時,線程池會補充一個新的線程。

②. newCachedThreadPool() 創建一個可緩存的線程池,如果線程池的規模超過了處理需求,將自動回收空閒線程,而當需求增加時,則可以自動添加新線程,線程池的規模不存在任何限制。

③. newSingleThreadExecutor() 這是一個單線程的Executor,它創建單個工作線程來執行任務,如果這個線程異常結束,會創建一個新的來替代它;它的特點是能確保依照任務在隊列中的順序來串行執行。

④. newScheduledThreadPool(int corePoolSize) 創建了一個固定長度的線程池,而且以延遲或定時的方式來執行任務,類似於Timer。

13.有數據庫優化的經驗嗎?說說你的優化方案吧

我覺得數據庫優化分爲以下五個點:

1.建表過程中對錶的設計和字段的處理方面要合理。不要給字段過多寬裕的空間,如果表會膨脹較大,就儘量不要用外鍵,可以在後端中抽象出一層去保證數據的完整性。

2.索引優化,要根據表的實際使用情況選擇要不要使用索引,比如修改次數遠多於查詢的表就不適合用索引,維護索引帶來的開銷會大於使用索引帶來的優勢。

3.SQL語句的優化,可以使用EXPLAIN關鍵字分析SQL語句執行的性能並去改善。還可以開啓慢查詢篩選出執行時間比較長的SQL語句進行優化,同時可以開啓查詢緩存。

4.數據庫表的拆分,可以根據業務選擇的橫向拆分或者縱向拆分。

5.redis緩存,通過緩存去分擔MySQL的查詢壓力。

14.synchronized 和 Lock 有什麼區別?

首先synchronized是java內置關鍵字,在jvm層面,Lock是個java類;synchronized無法判斷是否獲取鎖的狀態,Lock可以判斷是否獲取到鎖;synchronized會自動釋放鎖(a 線程執行完同步代碼會釋放鎖 ;b 線程執行過程中發生異常會釋放鎖),Lock需在finally中手工釋放鎖(unlock()方法釋放鎖),否則容易造成線程死鎖;用synchronized關鍵字的兩個線程1和線程2,如果當前線程1獲得鎖,線程2線程等待。如果線程1阻塞,線程2則會一直等待下去,而Lock鎖就不一定會等待下去,如果嘗試獲取不到鎖,線程可以不用一直等待就結束了;synchronized的鎖可重入、不可中斷、非公平,而Lock鎖可重入、可判斷、可公平(兩者皆可);Lock鎖適合大量同步的代碼的同步問題,synchronized鎖適合代碼少量的同步問題。

15.你認爲SpringIOC容器有缺點嗎?

我們都知道在項目很大很複雜時,會在IOC容器中添加很多的依賴,整個項目則是依賴IOC容器。因此在局部測試時也要初始化IOC容器以及其中的依賴,但是這些依賴很多是測試時不需要的,這樣往往測試的複雜性和性能開銷會變大。

16.說一下堆棧的區別?堆和棧的區別

堆棧空間分配區別:1、棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧;2、堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。

堆棧緩存方式區別:1、棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放;2、堆是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並不是一旦成爲孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。堆:內存中,存儲的是引用數據類型,引用數據類型無法確定大小,堆實際上是一個在內存中使用到內存中零散空間的鏈表結構的存儲空間,堆的大小由引用類型的大小直接決定,引用類型的大小的變化直接影響到堆的變化棧:是內存中存儲值類型的,大小爲2M,超出則會報錯,內存溢出

三、堆棧數據結構區別:堆(數據結構):堆可以被看成是一棵樹,如:堆排序;棧(數據結構):一種先進後出的數據結構。

17.Spring集成其他框架是怎麼實現的

這個因爲對其他的不太熟悉所以我拿ORM框來舉例回答的,我們都知道不論是hibernate還是mybatis在Spring中都能很好的得到集成。因爲這裏Spring有一個ORM接入模板,這個模板主要使用了模板方法的設計模式。而我們使用的各個ORM框架都重寫模板裏面的鉤子方法,接下來spring 通過調用模版方法直接就能使用到不同的ORM框架。

18.Redis 常見的性能問題有哪些?

該如何解決?1.master寫內存快照,seve命令調度rdbsave函數,會阻塞主線程的工程,當快照比較大的時候對性能的影響是非常大的,會間斷性暫停服務 。所以master最好不要寫內存快照。2.master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響master重啓時的恢復速度。master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啓用內存快照做持久化,如果數據比較關鍵,某個slave開啓AOF備份數據,策略每秒爲同步一次。3.master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源,導致服務load過高,出現短暫的服務暫停現象。4.redis主從複製的性能問題,爲了主從複製的速度和連接的穩定性,slave和master最好在同一個局域網內。

19.Redis 如何做內存優化?

1,使用對象共享池優化小整數對象。

2,數據優先使用整數,比字符串更節省空間。3,操作優化。儘量避免字符串的追加操作,因爲字符串存在預分配機制。追加操作後字符串對象會分配一倍的容量作爲於預留空間。4,編碼優化。list,hash,set,zset儘可能使用ziplist編碼。好處是內存下降,壞處是操作變慢。一般大小不超過1000。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章