JAVA系列:
-
聊一下類加載器
類加載器是用於加載類文件的類。Java源碼通過javac編譯器編譯成類文件, 然後JVM來執行類文件中的字節碼來執行程序。 類加載負責加載文件系統、網絡或其他來源的類文件。有三種默認使用的類加載器: Bootstrap類加載器、Extension類加載器和System類加載器(又稱Application類加載器) 1. Bootstrap類加載器負責加載JDK類文件,是所有類加載器的父加載器。 另外Bootstrap類加載器是唯一一個大部分是由C語言實現的,其他類加載器都是通過java實現的 2. Extension類加載器將加載類的請求先委託Bootstrap,若未成功加載, 再從其他目錄進行加載。 3. System類加載器,負責從classpath環境中加載應用相關的類 類加載器的工作原理基於三個機制:委託、可見性和一致性 委託: 假設有一個類需要加載,首先由System類加載器委託Extension類加載器加載, Extension再委託Bootstrap類加載器進行加載。Bootstrap進行查找,若存在這個類則加載, 若沒有這個類可以加載,再回到Extenstion類加載器查找,若找不到再回到System類加載器加載 可見機制:子類加載器可以看到父類加載器加載的類,反之不行 單一性:父類加載器加載過的類不能被子加載器加載第二次
-
介紹restfult規範
1. 使用標準方法(GET、POST、PUT、PATCH、DELETE)操作資源 2. 儘量採用https協議 3. 請求體與響應體 統一使用json格式承載,json使用駝峯命名, 媒體類型媒體類型需設置爲 ”application/json" 4. 請求響應統一使用UTF8格式,時間使用UTC格式:年月日時分秒 5. 消息響應對應的狀態碼
-
介紹整個JAVA虛擬機的構造(知道多少說多少)
-
介紹一下GC機制
-
聊一下Java中的數據結構
Java中常見的數據結構,主要分爲Collection 和 map 兩個主要接口 1. 常用類: a. ArrayList b. Vector (線程安全) c. LinkedList d. HashMap e. HashTable(線程安全) 2. 區分Vector、ArrayList和LinkedList 性能上來說ArrayList最好,但如果集合中元素需要頻繁插入刪除時LinkedList表現會更好, Vector適合用於線程同步的: a. 如果能用數組儘量用數組 b. 如果沒有頻繁增刪,優先用ArrayList c. 多線程時,考慮用Vector d. 頻繁增刪考慮用LinkedList
-
SpingCloud組件
-
客戶端和服務端使用socket進行連接,客戶端向服務端發送一條信息,並顯示發送成功,服務端收到了嗎
-
講一下Java的HashMap實現
HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。 HashMap底層是一個數組結構,數組中的每一項又是一個鏈表, 當新建一個HashMap時,就會初始化一個數組。 進入Map的KV,會根據hash值得到這個元素在數組中的位置(數組下標), 若該位置已存放了其他元素,那麼這個位置上的元素將以鏈表形式存放, 新加入的放在鏈頭(頭插法)。 當用戶試圖將一個KV存入HashMap中時,程序首先根據key的hashCode返回值決定Entry的存儲位置。 先遍歷該位置鏈表的key,是否存在相同的key,若存在則進銷覆蓋value,不存在則插入
-
線程之間如何進行通訊
1. 同步:通過Synchronized關鍵字來實現線程通信。 線程A和線程B需要調用同一個類中兩個不同的Synchronized方法, 儘管調用的方法不同,但是需要等待其中一個線程執行完對應方法,其他線程才能執行(相當於共享變量) 3. while輪詢:線程A在使用資源,線程B不斷使用while循環去查看資源是否到位 4. wait/notify:線程A需要調用資源1,而資源1未到位,則線程A調用wait()放棄CPU, 當資源1到位了,線程B調用notify()喚醒線程A,線程A進入就緒狀態 5. 管道通信
-
進程之間的通信:
1. 管道(Pipe) 2. 命名管道(FIFO) 3. 消息隊列 4. 信號量 5. 共享內存
-
簡介Volatile
1. volatile是一種比sychronized更輕量的同步機制 2. 當一個變量定義爲volatile後, 此變量對所有線程可見當一個變量定義爲volatile後, 此變量對所有線程可見 3. 用volatile修飾的變量會被存到內存中而非cpu緩存中,相當於多了一層內存屏障
-
ThreadLocal
-
跨域問題
跨域問題即同源問題,解決方法有jsonp、利用nginx反向代理、修改請求頭等
-
比較int和Integer
1. Integer是int 類型的包裝類,int則是java的基本數據類型 2. Integer必須實例化後才能使用,int不需要 3. 當new一個Integer時,實際上是生成一個指針指向對象,而int則是直接存儲數據值 4. Integer默認值爲null, int 默認值爲0 5. Integer通過new生成兩個值相同的對象是不相等的,因爲內存地址不同 6. java對-128到127之間的數會進行緩存,即Integer i = 127時會進行緩存, 下一次再寫Integer j = 127會直接從緩存中取出,不會再new一次
-
一個進程可以允許最大的線程數
默認情況下,一個線程棧大概要預留1M的空間,而一個進程可用的內存空間爲2G,理論上 一個進程中最多可以開2048個線程,但是內存不可能完全用於做線程棧,所以實際數目應該 比這個值要小。
計算機網絡系列:
-
七層OSI及對應的協議
-
三次握手和四次揮手
-
如果客戶端和服務端建立了tcp連接,突然將客戶端網線拔掉,服務器端知道嗎?
當客戶端與服務端建立正常TCP連接後,若客戶端主機斷開網線、電源掉電或系統崩潰, 服務器進程將永遠不會知道(通過我們常用的select,epoll監控不到斷開或錯誤時間), 如果不主動處理或重啓系統的話服務端會一直維持這個連接,這種情況稱爲半開連接。 除非我們配置了系統的SO_KEEPALIVE選項,或應用層的心跳檢測。 若網線斷開時間短暫,在SO_KEEPALIVE探測時間內,當連上網線此TCP連接會自動恢復。 反之,連上網線後要重新建立連接
-
聊一下常見的狀態碼
302重定向、304服務器無法滿足請求資源、400參數錯誤、401鑑權失敗、404無法找到網頁、 403服務器拒絕訪問、500服務器響應錯誤、503服務器故障
-
一條請求從瀏覽器發出後經過什麼到達服務器(假設後端使用SpringMVC):
瀏覽器請求 -> 應用層 -> 顯示層 -> 會話層 -> 傳輸層 -> 網絡層 -> 鏈路層 -> 物理層 -> 鏈路層 -> 網絡層 -> 傳輸層 -> 會話層 -> 顯示層 -> 應用層 -> dispatch Servlet -> Controller -> Model -> View -> 迴流
操作系統系列:
-
進程、線程、協程之間的關係
1. 進程是操作系統資源分配的最小單位 2. 線程是CPU調度的最小單位。一個進程可以由多個線程,多個線程共享進程資源 3. 協程被稱爲輕量級線程, 調度完全由用戶控制,擁有自己的寄存器上下文和棧 4. 線程的執行過程可以理解爲一個自上而下執行的程序,可以將這個程序切分成多個部分, 如A 、B、C.而協程,可以認爲一個程序由A、B、C多個部分組成。 現在執行到A的某一行,先暫停執行將其保存,轉而去執行B,如A 、B、C.而協程, 可以認爲一個程序由A、B、C多個部分組成。現在執行到A的某一行,先暫停執行將其保存, 轉而去執行B,等一定時間再回來接着執行A
-
死鎖場景
MySQL :
-
數據庫爲什麼要用B+樹:
文件很大,需要存儲到磁盤,使用B+樹可以減少訪問磁盤的次數