1.“你能不能談?wù)劊琷ava GC是在什么時候耀找,對什么東西,做了什么事情业崖?”
在什么時候:
- 新生代有一個Eden區(qū)和兩個survivor區(qū)野芒,首先將對象放入Eden區(qū),如果空間不足就向其中的一個survivor區(qū)上放双炕,如果仍然放不下就會引發(fā)一次發(fā)生在新生代的minor GC狞悲,將存活的對象放入另一個survivor區(qū)中,然后清空Eden和之前的那個survivor區(qū)的內(nèi)存妇斤。在某次GC過程中摇锋,如果發(fā)現(xiàn)仍然又放不下的對象,就將這些對象放入老年代內(nèi)存里去趟济。
- 大對象以及長期存活的對象直接進入老年區(qū)乱投。
- 當(dāng)每次執(zhí)行minor GC的時候應(yīng)該對要晉升到老年代的對象進行分析,如果這些馬上要到老年區(qū)的老年對象的大小超過了老年區(qū)的剩余大小顷编,那么執(zhí)行一次Full GC以盡可能地獲得老年區(qū)的空間。
對什么東西:
從GC Roots搜索不到剑刑,而且經(jīng)過一次標記清理之后仍沒有復(fù)活的對象媳纬。
做什么:
新生代:復(fù)制清理;
老年代:標記-清除和標記-壓縮算法施掏;
永久代:存放Java中的類和加載類的類加載器本身钮惠。
GC Roots都有哪些:
- 虛擬機棧中的引用的對象
- 方法區(qū)中靜態(tài)屬性引用的對象,常量引用的對象
- 本地方法棧中JNI(即一般說的Native方法)引用的對象七芭。
2.Synchronized 與Lock都是可重入鎖素挽,同一個線程再次進入同步代碼的時候.可以使用自己已經(jīng)獲取到的鎖。
Synchronized是悲觀鎖機制狸驳,獨占鎖预明。而Locks.ReentrantLock是,每次不加鎖而是假設(shè)沒有沖突而去完成某項操作耙箍,如果因為沖突失敗就重試撰糠,直到成功為止。 ReentrantLock適用場景
某個線程在等待一個鎖的控制權(quán)的這段時間需要中斷
需要分開處理一些wait-notify辩昆,ReentrantLock里面的Condition應(yīng)用阅酪,能夠控制notify哪個線程,鎖可以綁定多個條件。
具有公平鎖功能术辐,每個到來的線程都將排隊等候砚尽。
3.String、StringBuffer與StringBuilder之間區(qū)別
- 三者在執(zhí)行速度方面的比較:StringBuilder > StringBuffer > String
- string 字符串常量
StringBuffer是線程安全的辉词,每次操作字符串必孤,String會生成一個新的對象,而StringBuffer不會较屿;
StringBuilder是非線程安全的
4.Volatile和Synchronized四個不同點:
- 粒度不同隧魄,前者針對變量 ,后者鎖對象和類
- syn阻塞隘蝎,volatile線程不阻塞
- syn保證三大特性购啄,volatile不保證原子性
- syn編譯器優(yōu)化,volatile不優(yōu)化 volatile具備兩種特性:
5.線程池
線程池的作用:
在程序啟動的時候就創(chuàng)建若干線程來響應(yīng)處理嘱么,它們被稱為線程池狮含,里面的線程叫工作線程
第一:降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗曼振。
第二:提高響應(yīng)速度几迄。當(dāng)任務(wù)到達時,任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行冰评。
第三:提高線程的可管理性映胁。
常用線程池:
ExecutorService 是主要的實現(xiàn)類,其中常用的有
Executors.newSingleThreadPool(),
newFixedThreadPool(),
newcachedTheadPool(),
newScheduledThreadPool()甲雅。
6.SpringMVC運行原理
- 客戶端請求提交到DispatcherServlet
- 由DispatcherServlet控制器查詢HandlerMapping解孙,找到并分發(fā)到指定的Controller中。
- Controller調(diào)用業(yè)務(wù)邏輯處理后抛人,返回ModelAndView
- DispatcherServlet查詢一個或多個ViewResoler視圖解析器弛姜,找到ModelAndView指定的視圖
- 視圖負責(zé)將結(jié)果顯示到客戶端
7.Session與Cookie:
- Cookie可以讓服務(wù)端跟蹤每個客戶端的訪問,但是每次客戶端的訪問都必須傳回這些Cookie妖枚,如果Cookie很多缀旁,則無形的增加了客戶端與服務(wù)端的數(shù)據(jù)傳輸量搔确;
- Session則很好地解決了這個問題情龄,同一個客戶端每次和服務(wù)端交互時皆撩,將數(shù)據(jù)存儲通過Session到服務(wù)端,不需要每次都傳回所有的Cookie值抒寂,而是傳回一個ID结啼,每個客戶端第一次訪問服務(wù)器生成的唯一的ID,客戶端只要傳回這個ID就行了屈芜,這個ID通常為NAME為JSESSIONID的一個Cookie郊愧。這樣服務(wù)端就可以通過這個ID朴译,來將存儲到服務(wù)端的KV值取出了。
- Session和Cookie的超時問題属铁,Cookie的安全問題
8.分布式Session框架
- 配置服務(wù)器眠寿,Zookeeper集群管理服務(wù)器可以統(tǒng)一管理所有服務(wù)器的配置文件
- 共享這些Session存儲在一個分布式緩存中,可以隨時寫入和讀取焦蘑,而且性能要很好盯拱,如Memcache,Tair例嘱。
- 封裝一個類繼承自HttpSession狡逢,將Session存入到這個類中然后再存入分布式緩存中
- 由于Cookie不能跨域訪問,要實現(xiàn)Session同步拼卵,要同步SessionID寫到不同域名下奢浑。
9.Spring事務(wù)配置方法:
1.切點信息,用于定位實施事物切面的業(yè)務(wù)類方法
2.控制事務(wù)行為的事務(wù)屬性腋腮,這些屬性包括事物隔離級別雀彼,事務(wù)傳播行為,超時時間即寡,回滾規(guī)則徊哑。
Spring通過aop/tx Schema 命名空間和@Transaction注解技術(shù)來進行聲明式事物配置。
10.HashMap與HashTable的區(qū)別聪富。
1莺丑、HashMap是非線程安全的,HashTable是線程安全的墩蔓。
2窒盐、HashMap的鍵和值都允許有null值存在,而HashTable則不行钢拧。
3、因為線程安全的問題炕横,HashMap效率比HashTable的要高源内。
HashMap的實現(xiàn)機制:
維護一個每個元素是一個鏈表的數(shù)組,而且鏈表中的每個節(jié)點是一個Entry[]鍵值對的數(shù)據(jù)結(jié)構(gòu)份殿。
實現(xiàn)了數(shù)組+鏈表的特性膜钓,查找快,插入刪除也快卿嘲。
對于每個key,他對應(yīng)的數(shù)組索引下標是 int i = hash(key.hashcode)&(len-1);
每個新加入的節(jié)點放在鏈表首颂斜,然后該新加入的節(jié)點指向原鏈表首
11.死鎖的必要條件
- 互斥 至少有一個資源處于非共享狀態(tài)
- 占有并等待
- 非搶占
- 循環(huán)等待
解決死鎖:
第一個是死鎖預(yù)防,就是不讓上面的四個條件同時成立拾枣。
二是沃疮,合理分配資源盒让。
三是使用銀行家算法,如果該進程請求的資源操作系統(tǒng)剩余量可以滿足司蔬,那么就分配邑茄。
12.Java的四種引用,強弱軟虛俊啼,以及用到的場景
- 利用軟引用和弱引用解決OOM問題:用一個HashMap來保存圖片的路徑和相應(yīng)圖片對象關(guān)聯(lián)的軟引用之間的映射關(guān)系肺缕,在內(nèi)存不足時,JVM會自動回收這些緩存圖片對象所占用的空間授帕,從而有效地避免了OOM的問題同木。
- 通過軟可及對象重獲方法實現(xiàn)Java對象的高速緩存:比如我們創(chuàng)建了一Employee的類,如果每次需要查詢一個雇員的信息跛十。哪怕是幾秒中之前剛剛查詢過的彤路,都要重新構(gòu)建一個實例,這是需要消耗很多時間的偶器。我們可以通過軟引用和 HashMap 的結(jié)合斩萌,先是保存引用方面:以軟引用的方式對一個Employee對象的實例進行引用并保存該引用到HashMap 上,key 為此雇員的 id屏轰,value為這個對象的軟引用颊郎,另一方面是取出引用,緩存中是否有該Employee實例的軟引用霎苗,如果有姆吭,從軟引用中取得。如果沒有軟引用唁盏,或者從軟引用中得到的實例是null内狸,重新構(gòu)建一個實例,并保存對這個新建實例的軟引用厘擂。
- 強引用:如果一個對象具有強引用昆淡,它就不會被垃圾回收器回收。即使當(dāng)前內(nèi)存空間不足刽严,JVM也不會回收它昂灵,而是拋出 OutOfMemoryError 錯誤,使程序異常終止舞萄。如果想中斷強引用和某個對象之間的關(guān)聯(lián)眨补,可以顯式地將引用賦值為null,這樣一來的話倒脓,JVM在合適的時間就會回收該對象撑螺。
- 軟引用:在使用軟引用時,如果內(nèi)存的空間足夠崎弃,軟引用就能繼續(xù)被使用甘晤,而不會被垃圾回收器回收含潘,只有在內(nèi)存不足時,軟引用才會被垃圾回收器回收安皱。
- 弱引用:具有弱引用的對象擁有的生命周期更短暫调鬓。因為當(dāng) JVM 進行垃圾回收,一旦發(fā)現(xiàn)弱引用對象酌伊,無論當(dāng)前內(nèi)存空間是否充足腾窝,都會將弱引用回收。不過由于垃圾回收器是一個優(yōu)先級較低的線程居砖,所以并不一定能迅速發(fā)現(xiàn)弱引用對象虹脯。
- 虛引用:顧名思義,就是形同虛設(shè)奏候,如果一個對象僅持有虛引用循集,那么它相當(dāng)于沒有引用,在任何時候都可能被垃圾回收器回收蔗草。
13.Override和Overload的含義以及區(qū)別
- Overload顧名思義是重新加載咒彤,它可以表現(xiàn)類的多態(tài)性,可以是函數(shù)里面可以有相同的函數(shù)名但是參數(shù)名咒精、返回值镶柱、類型不能相同;或者說可以改變參數(shù)模叙、類型歇拆、返回值但是函數(shù)名字依然不變。
- 就是ride(重寫)的意思范咨,在子類繼承父類的時候子類中可以定義某方法與其父類有相同的名稱和參數(shù)故觅,當(dāng)子類在調(diào)用這一函數(shù)時自動調(diào)用子類的方法,而父類相當(dāng)于被覆蓋(重寫)了渠啊。