




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、# 數(shù)據(jù)結(jié)構(gòu)1. HashMap 的原理,數(shù)據(jù)結(jié)構(gòu)?- 底層使用哈希表(數(shù)組 + 鏈表),當(dāng)鏈表過長會將鏈表轉(zhuǎn)成復(fù)雜度內(nèi)查找樹以實現(xiàn) O(logn) 時間1. 講一下 HashMap 中 put 方法過程?1. 對 Key 求 Hash 值,然后再計算 下標(biāo)。1. 如果沒有碰撞,直接放入桶中,1. 如果碰撞了,以鏈表的方式到后面,1. 如果鏈表長度超過閥值(TREEIFY_THRESHOLD = 8),就把鏈表轉(zhuǎn)成樹。1. 如果節(jié)點已經(jīng)存在就替換舊值1. 如果桶滿了(容量 * 加載因子),就需要 resize。1. HashMap 中 hash 函數(shù)怎么是是實現(xiàn)的? 還有哪些 hash 的實現(xiàn)
2、方式?1. 高 16bit 不變,低 16bit 和高 16bit 做了一個異或1. (n - 1) & hash - 得到下標(biāo)1. 還有哪些 Hash 實現(xiàn)方式: 可以參考之前的博客 Effective Java 學(xué)習(xí)筆記 -hashCode()(./reading-notes/Effective-Java.md)1. HashMap 怎樣解決,講一下擴容過程,假如一個值在原數(shù)組中,現(xiàn)在移動了新數(shù)組,位置肯定改變了,那是什么定位到在這個值新數(shù)組中的位置,- 將新節(jié)點加到鏈表后,- 容量擴充為原來的兩倍,然后對每個節(jié)點重新計算哈希值。- 這個值只可能在兩個地方,一個是原下標(biāo)的位置,另一種是在下
3、標(biāo)為 的位置。1. 拋開 HashMap,hash有那些解決辦法?- 開放定址,鏈地址法1. 針對 HashMap 中某個 Entry 鏈太長,查找的時間復(fù)雜度可能達到 O(n),怎么優(yōu)化?- 將鏈表轉(zhuǎn)為樹, JDK1.8 已經(jīng)實現(xiàn)了。1. 數(shù)組和 ArrayList 的區(qū)別;1. 數(shù)組可以包含基本類型和對象類型,ArrayList 只能包含對象類型1. 數(shù)組大小固定,ArrayList 大小可以動態(tài)變化1. ArrayList 提供了的特性(addAll、removeAll)。1. Arraylist 如何實現(xiàn)排序- Collections.sort(List list);- sort(Li
4、st list, Comparator c);1. HashMap1. 數(shù)組 + 鏈表方式1. 默認容量: 16(2n 為宜,若定義的初始容量不是 2n,容量會定義為大于該初始容量的最小 2n)- 例如:初始容量為 13,則真正的容量是 16.1. put:1. 索引計算: (key.hashCode() (key.hashCode() 16) & (table.length - 1)1. 在鏈表中查找,并鏈表長度,若鏈表長度達到了 TREEIFY_THRESHOLD(8),則將該鏈轉(zhuǎn)成樹。1. 若在鏈表中找到了,則替換舊值,若未找到則繼續(xù)1. 當(dāng)總元素個數(shù)超過容量*加載因子時,擴容為原來 2
5、 倍并重新散列- (元素的下標(biāo)要么不變,要么變?yōu)椤驹聵?biāo)+原容量】)。1. 將新元素加到鏈表尾部1. 線程不安全1. HashTable1. 數(shù)組 + 鏈表方式1. 默認容量: 11(質(zhì)數(shù) 為宜)1. put:1. 索引計算 : (key.hashCode() & 0 x7F)% table.length1. 若在鏈表中找到了,則替換舊值,若未找到則繼續(xù)1. 當(dāng)總元素個數(shù)超過容量*加載因子時,擴容為原來 2 倍并重新散列。1. 將新元素加到鏈表頭部1. 對修改 Hashtable共享數(shù)據(jù)的方法添加了 synchronized,保證線程安全。1. HashMap ,HashTable 區(qū)別1.
6、默認容量不同。2. 索引計算方式不同。3. HashMap 特有的將過長鏈表轉(zhuǎn)換為樹。4. 新元素的位置不同。5. 線程安全性1. HashMap、ConcurrenshMap 區(qū)別。1. 索引計算消除了最的影響1. 默認容量: 16(若定義了初始容量(c),容量會定義為大于(c + (c 1) +1) 的最小 2n)- 例如:初始容量為 13,則真正的容量是 32.1. 線程安全,并發(fā)性能較好- 并發(fā)性能好的原因是 ConcurrenshMap 并不是定義 synchronized 方法,而是在鏈表頭上同步,不同的鏈表之間是互不影響的。1. ConcurrenshMap 原理1. 最大特點是
7、引入了 CAS(借助 Unsafe 來實現(xiàn)【native code】)1. CAS 有 3 個操作數(shù),內(nèi)存值 V,舊的預(yù)期值 A,要修改的新值 B。當(dāng)且僅當(dāng)預(yù)期值 A和內(nèi)存值 V 相同時,將內(nèi)存值 V 修改為 B,否則什么都不做。1. Unsafe 借助 CPU 指令 cmpxchg 來實現(xiàn)1. 使用實例:1. 對 sizeCtl 的控制都是用 CAS 來實現(xiàn)的1. sizeCtl :默認為 0,用來控制 table 的初始化和擴容操作。 - -1 代表 table 正在初始化 - N 表示有 -N-1 個線程正在進行擴容操作 - 如果 table 未初始化,表示 table 需要初始化的大小
8、。- 如果 table 初始化完成,表示 table 的容量,默認是 table 大小的 0.75 倍,居然用這個公式算 0.75(n - (n 2))。1. CAS 會出現(xiàn):ABA- 對變量增加一個版本號,每次修本號加 1,比較的時候比較版本號。1. TreeMap 和 TreeSet 區(qū)別原理- TreeSet 底層是 TreeMap,TreeMap 是基于樹來實現(xiàn)的。1. 如果想實現(xiàn)一個線程安全的隊列,可以怎么實現(xiàn)?1. 知道 LRU 嗎,20 分鐘基于 HashMap 實現(xiàn)一個 LRU 算法,面試官給個地址,進去寫代碼,面試官看如何設(shè)計實現(xiàn)一個-LRUCache ? (1%E5%AE%
9、9E%E7%8E%B0%E4%B8%80%E4%B8%AALRU-Cache%EF%BC%9F/)1. 二叉樹的遍歷方式,前序、中序、后序和層序- 可以再寫一篇了。1. 常見的排序算法時間復(fù)雜度(排序算法實現(xiàn)也要重點掌握)- 常見排序算法實現(xiàn)(Java)(./reading-notes/常見排序算法實現(xiàn).md)1.樹的特點及相比平衡二叉樹的優(yōu)點(先介紹各自特點)?-樹1. 每個節(jié)點要么是紅色,要么是黑色。1. 根節(jié)點是黑色的。1. 所有的葉節(jié)點都是空節(jié)點(即null),并且是黑色的。1. 每個紅色節(jié)點的兩個子節(jié)點都是黑色。(從每個葉子到根的路徑上不會有兩個連續(xù)的紅色節(jié)點)1. 從任一節(jié)點到其中
10、每個葉子節(jié)點的路徑都包含相同數(shù)量的黑色節(jié)點。- 平衡二叉樹1. 任何節(jié)點的兩個兒子的高度最大差別為一樹并不追求“完全平衡”它只要求部分地達到平衡要求,降低了對旋轉(zhuǎn)的要求,-從而提高了性能。1. B+樹的了解- 多分支結(jié)構(gòu)有效降低了樹的高度- B 樹的能使 B 樹保持較低的高度,從而達到有效避免磁盤過于頻繁的查找存取操作,從而有效提高查找效率1. Trie-Tree 原理及其應(yīng)用;- 字典樹- 特點1. 根節(jié)點不包含字符,除根節(jié)點外的每一個子節(jié)點都包含一個字符。1. 從根節(jié)點到某一個節(jié)點,路徑上經(jīng)過的字符連接起來,為該節(jié)點對應(yīng)的字符串。1. 每個節(jié)點的所有子節(jié)點包含的字符互不相同。是空間換時間-
11、 應(yīng)用1. 字符串檢索1. 詞頻統(tǒng)計# 算法題(劍指 Offer 上原題不少)1. 怎么查詢一個單向鏈表的倒數(shù)第五個節(jié)點1. 判斷鏈表是否成環(huán)1. 兩條相交的單向鏈表,如何求他們的第一個公共節(jié)點1. 在無序數(shù)組中找最大的 K 個數(shù)?1. 給定 n 個數(shù),尋找第 k 小的數(shù),同時給出時間復(fù)雜度1. 找一個數(shù)組中的第三大數(shù)1. 找出數(shù)組中第一個出現(xiàn) 2 次的數(shù),1. 求 1-N 中數(shù)字 1 的個數(shù)。1. 判斷一個數(shù)是不是丑數(shù);1. 求第 K 個丑數(shù);1. 10w 行數(shù)據(jù),每行一個單詞,統(tǒng)計出現(xiàn)次數(shù)出現(xiàn)最多的前 100 個。1. 一個文本文件,給你一個單詞,判斷單詞是否出現(xiàn)。1. 一進去要求敲代碼二
12、叉排序樹的、刪除及查找1. 某海量用戶,用戶擁有積分,積分可能會在使用過程中隨時更新。現(xiàn)在要為該設(shè)計一種算法,在每次用戶登錄時顯示其當(dāng)前積分負整數(shù),且小于 100 萬;。用戶最大規(guī)模為 2 億;積分為非1. 判斷一棵二叉樹是否是 BST。1. 一副54,現(xiàn)在分成 3 份,每份 18 張,問大小王出現(xiàn)在同一份中的概率是多少;1. 50 個白球 50 個紅球,兩個盒子,怎么放讓人隨機在一個盒子里抽到紅球概率最高。這個就是一個盒子放一個紅球,另一個盒子放 99 個球。1. logN 查找一個有序數(shù)組移動后類似 4 5 6 7 1 2 3 里面的一個數(shù)1. 0 n 連續(xù) n + 1 數(shù),現(xiàn)在有一個長度
13、為 n 的數(shù)組存放了上面 n + 1 個數(shù)的其中 n 個,找出哪一個數(shù)沒有被放進數(shù)組1. 將M 個平均長度為 N 的有序隊列組一個有序隊列1. 10 億條,找出前一萬條重復(fù)率高的1. 對一萬條數(shù)據(jù)排序,你認為最好的方式是什么1. 假100 萬個玩家,需要對這 100W 個玩家的積分中前 100 名的積分,按照順序顯示在中,要求是實時更新的。積分可能由做的任務(wù)和獲得的金錢決定。問如何對著 100萬個玩家前 100 名的積分進行實時更新?- 除了前 100 名,后 100W-100 名玩家的積分,讓變化的積分跟第 100 名比較,如果比第100 名高,那就替換的原則。# Java 基礎(chǔ)1. Jav
14、a 的優(yōu)勢- 語法簡單- 跨- 當(dāng)開發(fā)規(guī)模膨脹到一定程度,Java 在規(guī)范、協(xié)作和性能調(diào)優(yōu)上還是占有很大優(yōu)勢,在大型應(yīng)用,尤其是企業(yè)應(yīng)用上,Java 的地位仍然難以撼動占幾個字節(jié)1.1. 如果變量在棧上,那么它占用一個棧單元(32-bits)1. 如果在堆上,那么就跟 JVM 的實現(xiàn)有關(guān)了1. 在 Oracle 的 JVM 實現(xiàn), 中每個元素占用一個字節(jié)(8-bits)1. Java修飾符權(quán)限的區(qū)別;- public 所有類都可- protected 只允許包內(nèi)、子類。- 默認 只允許包內(nèi)- private 只允許類內(nèi)1. String 是否可以繼承, “+” 怎樣實現(xiàn)?- String 是
15、final 類,不可繼承。- + 是通過 StringBuilder(或 StringBuffer) 類,和 append 方法實現(xiàn)1. String , StringBuffer , StringBuilder , 區(qū)別, 項目中那里用到了StringBuilder或者 StringBuffer- String 不可變- StringBuffer,可變,線程安全- Stringbuilder,可變,線程不安全1. String 為啥不可變,在內(nèi)存中的具體形態(tài)?- String 使用 final char value 來存放字符序列。1. Comparable 接口和 Comparator 接
16、口實現(xiàn)比較- Comparable 是直接在被比較的類來實現(xiàn)的- Comparator 則是在被比較的類外部實現(xiàn)的1. Arrays 靜態(tài)類如何實現(xiàn)排序的?- 雙軸快排1. 首先檢查數(shù)組長度,如果比閥值(286)小,直接使軸快排1. 否則先檢查數(shù)組中數(shù)據(jù)的連續(xù)性,標(biāo)記連續(xù)升序,反轉(zhuǎn)連續(xù)降序,如果連續(xù)性好,使用 TimSort 算法(可以很好的利用數(shù)列中的原始順序)1. 否則使軸快排 + 成對排序1. Java 中異常機制。- Java 中所有異常都是 Throwable 的子類,他的直接子類有兩個,一個是 Error, 一個是Exception。- Error 一般表示 JVM 出現(xiàn)了嚴(yán)重問題
17、,比如說棧溢出或 OOM,- Exception 中異常分為兩類,- 一類是 RuntimeException 表示運行期間出現(xiàn)的錯誤,比較常見的是空指針異常和數(shù)組下標(biāo)越界,出現(xiàn)這種異常一般是程序出現(xiàn)了邏輯錯誤,也就是代碼有 Bug。- 另一類是編譯時異常(除了 RuntimeException 以外的異常),常見的一般有IOException等, 出現(xiàn)這種錯誤程序編譯會不通過。- 還有一種分類方式是 checked exception 和 uncheck exception。unchecked exception包括 Error 和 RuntimeExcetion,checked excep
18、tion 指之前所說的編譯時異常。1. Java 中異常怎么處理,什么時候拋出,什么時候捕獲;- 一般原則是提早拋出,延遲捕獲- 出現(xiàn)異常時,若當(dāng)前無法處理則拋,否則捕獲異常,嘗試恢復(fù)。1. 說一說對 java io 的理解- 按照使用的 IO 模型,大致可以分為三類:- BIO:JDK1.4 之前的阻塞 IO- NIO:JDK1.4 及以后的版本,非阻塞 IO- AIO:JDK1.7 之后,又叫 NIO.2,異步 IO- IO 總的來說分為兩個階段,第一階段是等待數(shù)據(jù)到達內(nèi)核緩沖區(qū),第二階段是將數(shù)據(jù)從內(nèi)核緩沖區(qū)到用戶緩沖區(qū)。- 阻塞 IO 是兩個階段都保持阻塞狀態(tài)。- 非阻塞 IO 第一個階
19、段不阻塞,但是需要輪詢來查看第一階段是否完成,完成以后進行第二階段,第二階段也是需要阻塞的。- IO 復(fù)用使用 select/poll,阻塞在這兩個系統(tǒng)調(diào)用上,而不是真正的 IO 操作上,這種方式的優(yōu)勢是可以同時多個文件描述符。檢查文件描述符是否就緒的工作是由select/poll 系統(tǒng)調(diào)用來負責(zé)的。Java 的 NIO 組合使用了IO 復(fù)用 + 非阻塞 IO 兩種 IO 模型。不過 Linux 版的 JDK 底層使用的系統(tǒng)調(diào)用是 epoll,它使用的模型類似與信號驅(qū)動式 IO 模型,當(dāng) IO 就緒時會受到消息不需要自己去做輪詢工作所以,效率相比 select/poll 會好上很多。但是 ep
20、oll 的缺點是可移植性較差,是 Linux專有的系統(tǒng)調(diào)用,select/poll 就比較通用了。- 信號驅(qū)動式 IO 在第一階段完成后發(fā)送信號,該階段不阻塞,不輪詢,然后阻塞進行第二階段。- 異步 IO 在兩個階段都完成以后才發(fā)送信號,數(shù)據(jù)是直接可用的。- 按照 IO 的對象,可以分為 4 類。分別是:1. 基于字節(jié)操作的 I/O 接口:InputStream 和 OutputStream1. 基于字符操作的 I/O 接口:Writer 和 Reader1. 基于磁盤操作的 I/O 接口:File1. 基于網(wǎng)絡(luò)操作的 I/O 接口:Socket1. 知不知道 NIO- 三個特點:1. Cha
21、nnels and Buffers / 通過 ChannelsBuffers, 一個 Channel 代表一個文件描述符-blocking IO/ 非阻塞 IO1./ 單線程,1. Selectorsnultiple Channels1. Java 鎖機制1. 重入鎖、對象鎖、類鎖的關(guān)系1. 哪些方法實現(xiàn)線程安全?- synchronized,volatile,然后重點說了下 volatile 在某些情況下可以實現(xiàn)線程安全,然后就把面試官注意力往 volatile 上引,因為 volatile 這個專門看了一下,果然,面試官馬上問了 volatile。1. Java 中的同步機制,synchr
22、onized 關(guān)鍵字,鎖(重入鎖)機制,其他解決同步的方volatile 關(guān)鍵字 ThreadLocal 類的實現(xiàn)原理要懂。1. Synchronized 和 lock 區(qū)別1. 鎖的優(yōu)化策略- 讀寫分離- 分段加鎖- 減少鎖持有的時間- 多個線程盡量以相同的順序去獲取資源1. Java 線程阻塞調(diào)用 wait 函數(shù)和 sleep 區(qū)別和聯(lián)系,還有函數(shù) yield,notify 等的作用。- sleep 時線程的方法(讓出 CPU),wait 是對象的方法。1. 談?wù)劦?Java 反射的理解,怎么通過反射某各類的私有屬性- 通過反射,可以獲取類的運行時結(jié)構(gòu)。- 反射 API 中有個方法 get
23、DeclaredFields()1. 動態(tài)的原理- 動態(tài)基于反射實現(xiàn),調(diào)用者通過對象來方法的時候,對象可以做相應(yīng)的處理,然后通過反射調(diào)用被對象的方法。1. 項目中都是用的框架,用過 Servlet 嗎? Servlet 是單例嗎?多線程下 Servlet 怎么保證數(shù)據(jù)安全的?Servlet 的生命周期?- 一般是單例,用的都是 Servlet 的 service,其中一般不包含實例變量,只有共享代碼,所以一般是安全的,如果有實例變量的話可以使用 synchronized 關(guān)鍵字進行加鎖。當(dāng)Servlet 實現(xiàn) SingleThreadM式。接口后,Tomcat 會為該 Servlet 建一個對
24、象池,這是享元模- 生命周期1. init 一般在 web 容器初始化,或第一次調(diào)用 servlet 時。1. service 提供服務(wù)1. destroy 終結(jié)1. 回收1. Thread 狀態(tài)有哪些- !(./res/java-thread-se.png)1. Java 實現(xiàn)線程的方式;哪種好;為什么好1. 單例模式的生命周期- 一般來說單例模式創(chuàng)建的對象是由類的 sic 變量著的,JVM 如果采用可達性分析算法來回收的話,該對象是不可能被回收的(從創(chuàng)建以后)。1. 繼承和多態(tài)的區(qū)別;1. Java8 的新特性。# Java 高級1. GC 算法,除了常見的算法,標(biāo)記整理,標(biāo)記清除算法,還
25、有哪些?- 增量算法。主要是收集線程與用戶線程交替執(zhí)行。也可以說一邊執(zhí)行回收一遍執(zhí)行用戶代碼。但是這種方造成系統(tǒng)吞吐量下降。- 分代收集。這種方法沒有使用新算法,只是根據(jù)對象的特點將堆分為年輕代和老年代,年輕代使用算法,老年代使用標(biāo)記整理算法。1.收集器- !gc collectors(./res/gc-collectors.jpg)- |收集器|收集算法|收集區(qū)域|線程|停頓|特點|:-:|:-:|:-:|:-:|:-:|:-:|serial|算法|單線程|收集時必須停頓其他所有工作線程|簡單高效|serial old|標(biāo)記整理|老年代|單線程|收集時必須停頓其他所有工作線程|PerNew|
26、算法|多線程|serial 的多線程版本|Server 模式下首選|parallel Scavenge|算法|多線程|收集時必須停頓其他所有工作線程|注重吞吐量,適合計算多|parallel old|標(biāo)記整理|老年代|多線程|收集時必須停頓其他所有工作線程|同 parallelScavenge|- 收集器搭配1. parallel Scavenge + parallel old /注重吞吐量的應(yīng)用1. CMS + PerNew /注重停頓時間的應(yīng)用,強交互環(huán)境/ 未來替代 CMS + PerNew1. G11. CMS(concurrent mark sp)并發(fā)收集、低停頓- !(./res/
27、jvm-cms-m.png)1. 初始標(biāo)記(CMS initial mark):僅僅只是標(biāo)記一下 GC Roots 能直接關(guān)聯(lián)到的對象,速度很快,需要“Stop The World”。1. 并發(fā)標(biāo)記(CMS concurrent mark):進行 GC Roots Tracing 的過程,在整個過程中耗時最長。1. 重新標(biāo)記(CMS remark):為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)而導(dǎo)致標(biāo)記產(chǎn)生變動的那一部分對象的標(biāo)記,這個階段的停頓時間一般會比初始標(biāo)記階段稍長一些,但遠比并發(fā)標(biāo)記的時間短。此階段也需要“Stop The World”。1. 并發(fā)清除(CMS concurrent sp)1.
28、 G1- 將整個Java 堆劃分為多個大小相等的獨立區(qū)域(Region),雖然還保留和老年代的概念,但的集合。和老年代不再是物理的了,而都是一部分 Region(不需要連續(xù))- 整體使用標(biāo)記整理,局部使用算法。- !(./res/jvm-g1-m.png)1. 初始標(biāo)記(Initial Marking) 僅僅只是標(biāo)記一下 GC Roots 能直接關(guān)聯(lián)到的對象,并且修改 TAMS(Nest Top Mark Start)的值,讓下一階段用戶程序并發(fā)運行時,能在正確可以的 Region 中創(chuàng)建對象,此階段需要停頓線程,但耗時很短。1. 并發(fā)標(biāo)記(Concurrent Marking) 從 GC R
29、oot 開始對堆中對象進行可達性分析,找到存活對象,此階段耗時較長,但可與用戶程序并發(fā)執(zhí)行。1. 最終標(biāo)記(Final Marking) 為了修正在并發(fā)標(biāo)記期間因用戶程序繼續(xù)而導(dǎo)致標(biāo)記產(chǎn)生變動的那一部分標(biāo)記,虛擬機將這段時間對象變化程的 Remembered SetLogs 里面,最終標(biāo)記階段需要把 Remembered Set Logs 的數(shù)據(jù)合并到 Remembered Set 中,這階段需要停頓線程,但是可并行執(zhí)行。1. 篩選回收(Live Dounting and Evacuation) 首先對各個 Region 中的回收價值和成本進行排序,根據(jù)用戶所期望的 GC 停頓是時間來制定回收
30、計劃。此階段其實也可以做到與用戶程序一起并發(fā)執(zhí)行,但是因為只回收一部分 Region,時間是用戶可控制的,而且停頓用戶線程將大幅度提高收集效率。1. G1 vs CMS1.選擇哪個收集器是由回收的目標(biāo)來決定的,主要考慮以下幾點:1. 吞吐量1. 停頓時間1. 堆容量1. G1 vs CMS- G1 基本不用配置,低停頓,用于大容量的堆。但是他犧牲了應(yīng)用程序的吞吐量和部分堆空間。- CMS 配置比較復(fù)雜,合理的低停頓,用于中等或更小的堆。- 所以當(dāng)你覺得配置 CMS 太難了,或你的堆在 2 G 以上,或你想要顯式的指定停頓時間那么你可以使用 G1。否則使用 CMS1. Java 內(nèi)存模型- 深入
31、理解 Java 虛擬機(./reading-notes/深入理解 Java 虛擬機.md)1. 問 JVM 內(nèi)存分代機制(會問分為那幾個代,各個代特點),分代回收的優(yōu)點(這個問了很多次)。- 分為年輕代和老年代,年輕的對象生命周期短,基本是朝生夕死,所以需要頻繁的回收;老年的對象一般都能熬過多次 GC 所以他們不需要頻繁回收。分代收集利用了這種特點,年輕代使用率相對還是不錯的。算法,老年代使用標(biāo)記整理算法,所以總的來說分代收集的效1. Java 虛擬機類加載機制,雙親委派模型- 深入理解 Java 虛擬機(./reading-notes/深入理解 Java 虛擬機.md)1. minC 和 F
32、ull GC 的觸發(fā)時機- minC: 當(dāng) eden 區(qū)滿以后會觸發(fā)。- Full GC:1. JVM 的一些特性比如分配擔(dān)保,大對象直接進入老年代,長期存活的對象進入老年代等等都會不斷增加老年代的使用率,當(dāng)老年代空間一次 Full GC以支持下一次 MinC 時會觸發(fā)1. 當(dāng)用戶代碼調(diào)用 System.gc 時,系統(tǒng)系統(tǒng)建議執(zhí)行 Full GC,但是否進行是由 JVM 來決定的。1. JVM 中什么樣的對象是可以回收的,對象從新年代到老年代的轉(zhuǎn)移過程,JVM 哪些地方會溢出(除了程序計數(shù)器都有)1. GC roots 不可達的對象是可以回收的。- 棧中的的對象- 方法區(qū)常量的對象- 方法區(qū)靜
33、態(tài)域的對象- JNI的對象1. 轉(zhuǎn)移過程- 當(dāng)對象熬過一定次數(shù)的 GC 后,會被轉(zhuǎn)移到老年代- 當(dāng) Eden + From surviver 中存活對象過多,To surviver 區(qū)存放不下的時候,剩余的對象會進入老年代1. Java 虛擬機的一些參數(shù)配置- 深入理解 Java 虛擬機(./reading-notes/深入理解 Java 虛擬機.md)1. 什么情況會棧溢出- 如果線程請求的棧容量超過棧允許的最大容量的話, Java 虛擬機將拋出一個StackOverflow 異常1. JDK1.8 中 JVM 做了那些改變- 主要是撤銷了代,引入元空間(本地內(nèi)存)1. 常用 JVM 調(diào)優(yōu)工
34、具有哪些(Jsus,JStack,Jmap 等),有沒有調(diào)有經(jīng)驗.1. 知道 OOM 嗎,舉一個 OOM 的例子- 內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù);- 啟動參數(shù)內(nèi)存值設(shè)定的過小;1. 介紹一下 Java 的強軟弱虛四種,問什么時候使用軟- 一般 new 出來的對象都是強,GC 不會回收強的對象- 軟:軟的對象不那么重要,當(dāng)內(nèi)存時可以被回收。非常適合于創(chuàng)建緩存。- 弱:只是一個對象,若一個對象的所有都是弱的話,下次 GC 會回收該對象。一般用在集合類中,特別是哈希表。- 虛:一般用于對實現(xiàn)比較精細的內(nèi)存使用控制。對于移動設(shè)備來說比較有意義1. RPC 原理;- 你應(yīng)該知道
35、的RPC 原理(http:/92290/)# 三大框架1. Spring 主要是什么,回答 IOC 和 AOP,怎么自己實現(xiàn) AOP ?- IOC 的好處:阿里一面總結(jié) 12 題(阿里一面總結(jié).md)- 使用基于反射的動態(tài)1. SprinP 用的哪一種- JDK 動態(tài),這種是一般意義上的動態(tài);用一個類來間接調(diào)用目標(biāo)類的方法。目標(biāo)類如果實現(xiàn)了接口那就用這種方式。- cglib 動態(tài)。通過框架轉(zhuǎn)換字節(jié)碼生成目標(biāo)類的子類,并覆蓋其中的方法實現(xiàn)增強,因為采用的是繼承,所以不能對 final 類進行方法。目標(biāo)類沒有實現(xiàn)任何接口,就使用這種1. spring bean 初始化過程XML 資源,并,最終到B
36、ean Factory 中-1. spring bean 對象的生命周期- 當(dāng)一個 bean 被實例化時,它需要執(zhí)行一些初始化(init-method)使它轉(zhuǎn)換成可用狀態(tài)。同樣,當(dāng) bean 不再需要,并且從容器中移除時,需要做一些清除工作(destroy-method)1. 講講 Spring 中 ApplicationContext 初始化過程。- ApplicationContext 的初始化重點是在 refresh 方法,其中最關(guān)鍵的幾步是:1. 創(chuàng)建 bean Factory1. 初始化消息源1. 初始化應(yīng)用事件器1. 初始化單例 bean1. SpringMVC 處理請求的流程-
37、!(./res/springmvc-flow.png)1. 收到用戶請求1. dispatcher Servlet 將請求轉(zhuǎn)發(fā)到相應(yīng)的 Controller1. 通過 View Resolver 進行視圖1. 返回給用戶1. SpringMVC 的設(shè)計模式1. Spring 的 annoion 如何實現(xiàn)1. Spring器怎么使用,Controller 是單例嗎1. 基于 XML 配置文件1. 基于注解1. 基于 Spring 定義的 Methoderceptor 接口- Controller 是單例的,跟 Servlet 一樣。# 數(shù)據(jù)庫1. SQL 優(yōu)化方案根據(jù)我目前的知識水平,大概分為兩
38、類:1. 多表連接時不直接連接表,而是先用 where 篩選出符合條件的然后進行連接。一般情況下,篩選一次會除去相當(dāng)多的無效,這會極大的提高效率。1. 判斷當(dāng)前的 SQL 是否合理的使用了索引。如果設(shè)置的索引沒有使用的話,會導(dǎo)致全表掃描。效率上會差很多。沒有利用索引的情況一般有以下幾種:- 以“%”開頭的 LIKE 語句,模糊匹配- OR 語句前后沒有同時使用索引- 數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)化(如 varchar 不加單引號的話可能會自動轉(zhuǎn)換為型)- where 子句中對字段進行表達式操作- 在 where 子句中對字段進行函數(shù)操作1. 索引有哪些?分別特點?- 從底層數(shù)據(jù)結(jié)構(gòu)來劃分的話,主要有兩種
39、:一種是基于 B+ 樹的索引,一種是基于哈希表的索引。基于哈希表的索引在等值查詢上有優(yōu)勢,但其他方面就不是很好了。B+樹是一種多分支的樹結(jié)構(gòu),相比二叉樹來說高度降低了很多,能夠有效的減少磁盤 IO,所以平時使用的都是基于 B+ 樹的索引1. 索引為什么用 B 樹不用二叉樹,好處?- 基于 B 樹的索引實現(xiàn),降低了樹的高度,減少了磁盤 IO 的次數(shù)。1. 數(shù)據(jù)庫索引優(yōu)點和缺點- 優(yōu)點:有效加速查詢;- 缺點:操作數(shù)據(jù)時需要對索引進行更新,效率上稍微差一點;索引需要占用一定的空間。1. 數(shù)據(jù)庫事務(wù)的四個級別,在哪一個級別- !(./res/isolation-level.png)默認級別為 Rep
40、eatable read-1. 數(shù)據(jù)庫,兩次相同的 select 操作,期間沒有發(fā)生增,刪,改操作,返回的結(jié)果是否相同;- 如果是多線程 select 數(shù)據(jù),那么數(shù)據(jù)很大可能不相同(select 操作中有排序操作除外)- 如果是單線程的,那么一定相同。1. 怎么設(shè)計數(shù)據(jù)庫表(從范式角度,可以加一些設(shè)計慣例)- 理論上說達到第三范式是符合要求的但是一般生產(chǎn)環(huán)境下為了數(shù)據(jù)查詢方便,數(shù)據(jù)會有一定的冗余,也就是說一般達到第二范式即可。1. 第一范式:字段不可分1. 第二范式:非主屬性必須完全函數(shù)依賴于主屬性1. 第三范式:消除了第二范式中的傳遞函數(shù)依賴引擎有哪些,INNODB 和 MYISAM 的區(qū)別
41、1.- !(./res/-storage-engines-feature-summary.png)支持 8 種引擎,其中最主要的有兩個:InnoDB、MyISAM。- MyISAM 支持表級鎖。適用于選擇密集型和密集型的表- InnoDB 是 5.7.16-logCommunity Server 默認的引擎,支持事務(wù),行級鎖,外鍵,索引。適用于更新密集的表,容災(zāi)性也較好。1. 實踐中如何優(yōu)化- SQL 語句及索引的優(yōu)化- 數(shù)據(jù)庫表結(jié)構(gòu)的優(yōu)化- 系統(tǒng)配置的優(yōu)化- 硬件的優(yōu)化1. 慢查詢慢查詢就是在日志中運行比較慢的 SQL 語句,這個功能需要開啟才能用。-1.(8) 和(10) 的區(qū)別是什么-
42、與 zerofill 結(jié)合使用才有意義,默認是(10),也就是說定義字段時加上 zerofill,如果的值10 位的話,select 的時候會加上前導(dǎo) 0 補足 10 位,如果的值大于等于10 位則直接顯示原值。所以這個地方 8 和 10 的區(qū)別就在于是補足 8 位還是 10 位。# 操作系統(tǒng)1. 進程和線程的區(qū)別1. 進程是擁有資源的基本,線程是 CPU 調(diào)度的基本1. 進程擁有獨立的地址空間,同一個進程的線程共享該進程的地址空間1. 進程上下文切換相對線程上下文切換會消耗的資源1. 一個進程必須至少擁有一個線程1. 一個線程死掉就等于整個進程死掉,所以多進程的程序相對于多線程的程序來說會更
43、健壯1. 通信方式不同,線程通過進程內(nèi)的資源進行通信,進程的通信有多種方式,包括管道、共享內(nèi)存、消息等等。1. 進程間通信1. 管道(Pipe)及有名管道(named pipe):管道可用于具有親緣關(guān)系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關(guān)系進程間的通信;1. 信號(Signal):信號是比較復(fù)雜的通信方式,用于通知接受進程有某種事件發(fā)生,除了用于進程間通信程還可以發(fā)送信號給進程本身;1. 報文(Message)隊列(消息隊列):消息隊列是消息的表。有足夠權(quán)限的進程可以向隊列中添加消息,被賦予讀權(quán)限的進程則可以讀走隊列中的消息。消息隊列
44、克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。1. 共享內(nèi)存:使得多個進程可以同一塊內(nèi)存空間,是最快的可用 IPC 形式。是針對其他通信機制運行效率較低而設(shè)計的。往往與其它通信機制,如信號量結(jié)合使用,來達到進程間的同步及互斥。1. 信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步。1. 套接口(Socket):更為一般的進程間通信機制,可用于不同機器之間的進程間通信。1. 在共享內(nèi)存中如何使用mutex1. select 和 epoll1. 操作系統(tǒng)由哪幾部分組成,進程結(jié)構(gòu)1. 多進程和多線程的區(qū)別1. 什么時候使用多線程,什么時候使用多進
45、程1. Java 多線程與操作系統(tǒng)線程的關(guān)系1. 一般線程和守護線程的區(qū)別1. 多線程與多線程的實現(xiàn)方式1. 死鎖的條件,死鎖避免。1. 互斥條件1. 占有和等待條件1. 不條件1. 循環(huán)等待1. linux 中如何查看進程等命令1. 不同進程打開了同一個文件,那么這兩個進程得到的文件描述符(fd)相同嗎- 不一定,因為打開文件有三個表,inode 表,系統(tǒng)文件描述符表,進程文件描述符表。不同進程的文件描述符的范圍是一樣的,有可能剛好相同,也有可能不相同1. 兩個線程如何同時一個端口。- SO_REUSEPORT 參數(shù)。# 計算機網(wǎng)絡(luò)1. HTTP 狀態(tài)碼有哪些,一一解釋含義1. 1xx 消息
46、- 100 服務(wù)器僅接收到部分請求,但是一旦服務(wù)器并沒有發(fā)送其余的請求。該請求,客戶端應(yīng)該繼續(xù)1. 2xx 成功- 200 OK 請求成功(其后是對 GET 和T 請求的應(yīng)答文檔。)1. 3xx 重定向- 304 Not Modified 未修改的文檔??蛻舳擞芯彌_的文檔并發(fā)出了一個條件性的請求(一般是提供 If-Modified-Since 頭表示客戶只想比指定日期更新的文檔)。服務(wù)器告訴客戶,原來緩沖的文檔還可以繼續(xù)使用。1. 4xx: 客戶端錯誤- 400 Bad Request 服務(wù)器未能理解請求。- 404 Not Found 服務(wù)器無法找到被請求的頁面。1. 5xx: 服務(wù)器錯誤e
47、rnal Server Error 請求未完成。服務(wù)器遇到不可預(yù)知的情況。- 5001. HTTP 請求頭有哪些,介紹平時見過的,怎么利用這些信息來進行前后端調(diào)試1. Host, 請求的1. User-Agent,用戶的瀏覽器版本信息1. Accept,響應(yīng)的內(nèi)容類型1. Accept-Language, 接受的語言1. Accept-Encoding, 可接受的編碼方式,本地的信息1. 1. if-Modified-Since, 本地有緩存,如果在那之后沒有做修改,則可以直接使用本地緩存。1. TCP 和 UDP 的區(qū)別- !(./res/diff-tcp-udp.png)1. TCP 如何
48、保證可靠性1. 累計確認1. 超時重傳1. 超時間隔加倍1. 快速重傳1. 擁塞控制與流量控制的區(qū)別- 流量控制是由接收控制的,擁塞控制由當(dāng)前的網(wǎng)絡(luò)環(huán)境來控制。1. OSI 七層模型,每層對應(yīng)的協(xié)議有哪些,每層有何含義- !(./res/tcp-ip-m.png)1. 網(wǎng)絡(luò)瀏覽器一個發(fā)生了什么過程1. 在地址欄輸入 URL,并回車1. 瀏覽器查詢的 IP。一般會有以下幾個地方:1. 瀏覽器緩存1. 操作系統(tǒng)緩存1. 路由器緩存1. 本地 DNS 服務(wù)器1. 如果本地 DNS 服務(wù)器上沒有的話,它會遞歸的從根 DNS 服務(wù)器、頂級 DNS 服務(wù)器、DNS 服務(wù)器請求,然后把獲取到的IP 返回給瀏
49、覽器(DNS 協(xié)議基于 UDP)。1. 瀏覽器向 web 服務(wù)器發(fā)送 HTTP 請求1. HTTP 協(xié)議基于 TCP,建立連接需要經(jīng)過三次握手,并且該連接是長連接,即 keep-alive1. IP 數(shù)據(jù)包在網(wǎng)絡(luò)傳輸中還需要經(jīng)過域間選路和域內(nèi)選路。1. 若長時間接收不到應(yīng)答,TCP 會進行重傳和擁塞控制。1. BLABLABLA.1. web 服務(wù)器處理請求1. web 服務(wù)器回傳一個 HTTP 相應(yīng)1. 瀏覽器接收到以后HTML 并顯示1. 瀏覽器請求嵌入在 HTML 中的對象1. 最終瀏覽器呈現(xiàn)一個圖文并茂的頁面和 Ses的區(qū)別1.1. Ses是在服務(wù)器端的,是在客戶端的/TODO1. H
50、TTP1.0 和 1.1 的區(qū)別- 最主要的區(qū)別是 1.1 支持持久連接。Connection 請求頭的值為 Keep-Alive 時,客戶端通知服務(wù)器返回本次請求結(jié)果后保持連接;Connection 請求頭的值為 close 時,客戶端通知服務(wù)器返回本次請求結(jié)果后關(guān)閉連接。- 1.1 支持?jǐn)帱c續(xù)傳。RANGE:bytes= 表示要求服務(wù)器從文件字節(jié)處開始傳送- 還有一些其他的改進,有可以自行查閱相關(guān)資料1. HTTP 和 HTTPS 的主要區(qū)別- 安全。HTTP 直接與 TCP 通信,而 HTTPS 是先與 SSL(加密) 通信,然后再由 SSL 和 TCP通信1. 滑動窗口算法- 又稱回退
51、 N 步(go-back-N),發(fā)送方的窗口滑動是由接收方是否已成功收到數(shù)據(jù)包來決定的。即接收方的窗口向前滑動后發(fā)送方的窗口才會向前滑動。/TODO詳細過程1.1. IP 地址分為幾類,每類都代表什么,私網(wǎng)是哪些- A:前 1 byte 為網(wǎng)絡(luò)標(biāo)識,剩下的是主機標(biāo)識- B:前 2 bytes 為網(wǎng)絡(luò)標(biāo)識- C:前 3 bytes 為網(wǎng)絡(luò)標(biāo)識- D:為多播地址,最為 1110- E:特殊 IP。例如 ,,55 等等- 私網(wǎng)- /8- /12- /161. IP 頭組成;1. 計算機網(wǎng)絡(luò)中的同步和異步1. 發(fā)現(xiàn)上不去,怎么辦1. 查看 DNS是否正確。若有錯誤,刪除本地 DNS 緩存1. 若 DNS 沒有問題,使用 traceroute 檢
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級物理第4章第4節(jié):光的折射
- 太陽能發(fā)電站智能維護技術(shù)考核試卷
- 有機肥料在農(nóng)業(yè)可持續(xù)發(fā)展中的作用考核試卷
- 意外傷害保險與應(yīng)急救援體系的融合考核試卷
- 學(xué)術(shù)人才引進與培養(yǎng)考核試卷
- 醫(yī)療設(shè)備在精準(zhǔn)醫(yī)療領(lǐng)域的創(chuàng)新應(yīng)用與挑戰(zhàn)解決策略考核試卷
- 醫(yī)療器械在跨學(xué)科協(xié)作中的價值考核試卷
- 文具行業(yè)品牌年輕化考核試卷
- 動物藥品零售企業(yè)財務(wù)管理考核試卷
- 收購農(nóng)村車庫合同范本
- 2025年服裝制版師(中級)職業(yè)技能鑒定考試題(附答案)
- 一年級下冊綜合實踐活動教案2
- 九年級主題班會課件:遇見最好的自己(開學(xué)第一課)
- 2025版股權(quán)投資基金股份收購與退出機制協(xié)議3篇
- 【營銷方案】2025小紅書平臺營銷通案
- 2025年棗莊科技職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 護苗行動安全教育課件
- 油品庫房管理規(guī)定(2篇)
- 礦山工程安全培訓(xùn)課件
- 2025年月度工作日歷含農(nóng)歷節(jié)假日電子表格版
- 2024年長沙民政職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案解析
評論
0/150
提交評論