標籤:java記憶體模型 封裝 尋找 跳轉 網域名稱 透明 渲染 裝飾模式 同名
Java是否存在記憶體泄露
記憶體泄露是指一個不再被程式使用的對象或變數還在記憶體中佔有儲存空間。
如果開發人員忘記釋放已指派的記憶體就會造成記憶體泄露。
在Java中,判斷一個記憶體空間是否符合記憶體回收機制標準有兩個:
- 給對象賦予了null,以後再沒使用過
- 給對象賦予了新值,重新分配了記憶體空間
記憶體泄露主要有兩種情況:
- 在堆中申請的空間沒有被釋放
- 對象已經不再使用,但還是在記憶體中保留著
Java中的記憶體回收機制可以解決情況1,所以記憶體泄露主要是情況2
在Java中,引起記憶體泄露的主要原因有:
- 靜態集合類
- 各種串連,如資料庫連接、網路連接以及IO串連等
- 監聽器
- 變數不合理的範圍
- 單例模式可能會造成記憶體泄露
Java中的堆和棧有什麼區別
堆和棧都是記憶體中存放資料的地方
堆主要用來存放對象,棧用來執行程式
棧的存取速度比堆快
堆可以在運行中動態分配記憶體
當main()方法退出後,棧中的變數會被回收
Java Collections 架構是什麼
Java Collections架構中包含了大量集合介面、這些介面的實作類別、操作他們的演算法。
Set
表示數學意義上的集合概念。特點是集合中的元素不能重複
HashSet
TreeSet :容器中的元素是有序的
List
又稱為有序的Collection。
按對象進入的順序儲存對象,多以它能對列表中的每個元素的插入和刪除位元置進行精準的控制。
同時,它可以儲存重複的對象。
Map
提供了一個從鍵映射到值的資料結構。它用於儲存索引值對,其中值可以重複,鍵是唯一的。
HashMap 是基於散列表實現的,採用對象 HashCode 可以進行快速查詢。
LinkedHashMap 採用列表來維護內部的順序。
TreeMap 基於紅/黑樹狀結構的資料結構來實現的,內部元素是按需排列的。
cookie和session區別
- cookie儲存在用戶端,資料存放在客戶的瀏覽器上;session機制採取儲存在伺服器端的方案,資料存放在伺服器上。
- cookie安全性不夠,session資訊存放在伺服器,因此較為安全。
- cookie效能更高
- 單個cookie儲存的資料大小不能超過4 KB,而session不存在這個問題。
Hibernate優點
- 提高開發效率
- 可以完全採用物件導向的思想,不需要關心資料庫的關聯式模式
- 有很好的移植性
- 支援透明持久化
使用Hibernate提高效能
- 消極式載入
- 緩衝技術
- 最佳化查詢語句
分頁機制
當資料量很大時,如果一次性的把資料取出來,不僅浪費時間,還消耗大量的記憶體
採用分頁機制使得查詢的結果集中資料量減少了,同時也降低了記憶體的消耗,因此可以顯著降低回應時間,有助於提高系統的可用性,增強使用者體驗。
方法:
- 架構內建分頁機制
- SQL語句實現分頁
GC
自動檢測對象的範圍,自動的把不再被使用的儲存空間釋放掉。
作用
- 分配記憶體
- 確保被引用的對象不被錯誤的回收
- 回收不再被引用的對象的記憶體空間
記憶體回收演算法
- 引用計數法:缺點是無法處理循環參考問題
- 標記-清除法:標記所有從根節點開始的可達對象,缺點是會造成記憶體空間不連續,不連續的記憶體空間的工作效率低於連續的記憶體空間
- 複製演算法:將記憶體空間分成兩塊,每次將正在使用的記憶體中存活對象複製到未使用的記憶體塊中,之後清除正在使用的記憶體塊。適用於新生代(存活對象少,垃圾對象多)
- 標記-壓縮演算法:清除未標記的對象時還將所有的存活對象壓縮到記憶體的一端,之後,清除邊界所有空間。適用於老年代。
- 分代
死結
當線程需要持有多個鎖時,就有可能產生死結。
線程A當前持有互斥鎖lock1,線程B當前持有互斥鎖lock2。
A想要lock2,B也想要lock1,互相試圖擷取對方的,又不肯先釋放自己的,就陷入了無盡的等待/阻塞。
這種情況成為死結。
ArrayList、Vector、LinkedList區別
| 容器 |
動態 |
擴充大小 |
同步? |
安全? |
效率 |
| ArrayList |
可伸縮數組 |
1.5倍 |
非同步 |
不是安全執行緒 |
索引or在末端增刪元素效率高 |
| Vector |
可伸縮數組 |
2倍 |
絕大多數方法同步 |
安全執行緒 |
索引or在末端增刪元素效率高、多線程 |
| LinkedList |
可伸縮數組 |
|
|
非安全執行緒 |
雙向列表實現,插入資料高,指定位置插入or刪除元素效率高 |
排序演算法對比
| 排序演算法 |
最好時間 |
平均時間 |
最壞時間 |
輔助儲存 |
穩定性 |
備忘 |
| 簡單選擇排序 |
$O(n^2)$ |
$O(n^2)$ |
$O(n^2)$ |
$O(1)$ |
不穩定 |
n小時較好 |
| 直接插入排序 |
$O(n)$ |
$O(n^2)$ |
$O(n^2)$ |
$O(1)$ |
穩定 |
大部分已有序時較好 |
| 冒泡排序 |
$O(n)$ |
$O(n^2)$ |
$O(n^2)$ |
$O(1)$ |
穩定 |
n小時較好 |
| 希爾排序 |
$O(n)$ |
$O(nlogn)$ |
$O(n^s)(1<s<2)$ |
$O(1)$ |
不穩定 |
s是所選分組 |
| 快速排序 |
$O(nlogn)$ |
$O(nlogn)$ |
$O(n^2)$ |
$O(logn)$ |
不穩定 |
n大時較好 |
| 堆排序 |
$O(nlogn)$ |
$O(nlogn)$ |
$O(nlogn)$ |
$O(1)$ |
不穩定 |
n大時較好 |
| 歸併排序 |
$O(nlogn)$ |
$O(nlogn)$ |
$O(nlogn)$ |
$O(n)$ |
穩定 |
n大時較好 |
什麼是值傳遞和引用傳遞
- 值傳遞:方法調用時,實參會把它的值傳遞給形參,形參用實參的值初始化一個臨時的儲存單元,因此值一樣,儲存單元不一樣,形參的改變不會影響實參。
- 引用傳遞:在方法調用時,傳遞的是對象,形參與實參指向同一Block Storage單元,對形參的改變就會改變實參。
物件導向的三個基本元素
- 封裝: 封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。物件導向計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的介面訪問其他對象。
- 繼承: 繼承是一種連接類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的衍生類別(子類),而原始類稱為新類的基類(父類)。衍生類別可以從它的基類那裡繼承方法和執行個體變數,並且類可以修改或增加新的方法使之更適合特殊的需要。
- 多態: 多態性是指允許不同類的對象對同一訊息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行為共用、代碼共用的優勢,很好的解決了應用程式函數同名問題。
是否可以主動通知JVM進行記憶體回收?
由於記憶體回收行程的存在,Java語言沒有提供給開發人員釋放已指派記憶體的方法,開發人員不能即時的調用記憶體回收行程對某個對象或所有對象進行記憶體回收。
但是開發可以調用System.gc()方法來“通知”記憶體回收行程運行,當然,JVM也不會馬上運行。
Java中堆和棧的區別
- 棧記憶體主要用來存放基礎資料型別 (Elementary Data Type)和引用變數;堆記憶體用來存放運行時建立的對象
- 堆主要用來存放對象,棧主要用來執行程式
線程狀態有哪些,它們之間是如何轉換的
- New(建立):剛建立,還沒調用start方法
- Runnable(可運行):可以在Java虛擬機器中啟動並執行狀態
- Blocked(被阻塞):當一個線程擷取其他線程的內部對象鎖而不得
- Waiting(等待):當線程等待另一個線程通知調度器一個條件時,它自己進入等待狀態
- Timed waiting(計時等待):有逾時參數的方法會讓線程進入計時等待,如果逾時或者出現通知,會切換到可運行狀態
- Terminated(被終止):因為run方法正常退出或因為沒有捕獲的異常終止了run方法而死亡
線程與進程的區別,各有什麼優缺點
線程:是指程式在執行過程中,能夠執行程式代碼的一個執行單元。4個狀態:運行,就緒,掛起,結束。
進程:是指一段正在執行的程式。
建立一個線程比建立一個進程所要的資源少。
當你在瀏覽器輸入一個網址,如http://www.taobao.com,按斷行符號之後發生了什嗎?
請從技術的角度描述,如瀏覽器、網路(UDP、TCP、HTTP等),以及伺服器等各種參與對象上由此引發的一系列活動,請儘可能的涉及到所有的關鍵技術點。
1.DNS網域名稱解析:瀏覽器緩衝、系統緩衝、路由器、ISP的DNS伺服器、根網域名稱伺服器。把網域名稱轉化成IP地址。 2.與IP地址對應的伺服器建立TCP串連,經曆三向交握:SYN,ACK、SYN,ACK 3.以get,post方式發送HTTP請求,get方式發送主機,使用者代理程式,connection屬性,cookie等 4.獲得伺服器的響應,顯示頁面-----------------------------------------------------------1 查緩衝2 DNS解析3 擷取ip4 建立tcp串連5 發http資料6 接受http資料並解析7 close-------------------------------------------------------------------1、根據網域名稱查詢網域名稱的IP。瀏覽器緩衝->作業系統緩衝->本地區名伺服器緩衝->網域名稱伺服器。2、得到IP後發起基於TCP的HTTP請求。如果瀏覽器儲存了該網域名稱下的cookie,那麼會把cookie放入HTTP要求標頭裡。3、TCP被封裝為IP包,通過網路(可能經過很多路由器、交換器)發送到IP地址對應的伺服器。這個伺服器可能只是一個反向 Proxy伺服器,如果是,則HTTP請求被轉交給內網中真實的某一個伺服器(可能有多個伺服器)。4、伺服器分析HTTP請求,產生HTTP響應(可能是HTML、圖片等)後,將響應發送給用戶端瀏覽器。5、瀏覽器得到響應後,根據響應內容顯示結果。如果響應的是圖片,則將圖片”畫“在瀏覽器頁面上;如果是HTML,則渲染HTML並”畫“在瀏覽器頁面上,在分析HTML時,若發現引用了其他資源,例如css、圖片等,則發起HTTP請求,得到響應資源。
linux中cat、more、less命令區別
均可用來查看檔案內容
| 命令 |
區別 |
功能對比 |
| cat |
一次性顯示整個檔案的內容,還可以將多個檔案串連起來顯示,常與重新導向符號配合使用,適用於檔案內容少的情況 |
一般 |
| more |
一般用於顯示檔案內容超過一屏的內容,提供翻頁的功能。提供分頁顯示。 |
強 |
| less |
一般用於顯示檔案內容超過一屏的內容,提供翻頁的功能。翻頁、跳轉、尋找。 |
更強 |
- 索引的作用及代價?如何建好索引?索引的原理
- Hash演算法
- 演算法:二分尋找演算法,冒泡排序、選擇排序演算法、插入排序、歸併、希爾、快排演算法
- 鎖:樂觀鎖和悲觀鎖
- 什麼情況下會產生死結?如何避免死結?
- JVM GC:介紹記憶體回收機制,記憶體回收演算法。
- JAVA的反射機制
- Java集合類有哪些,分別在哪些情境使用
- Linux下如何快速尋找某個檔案
- Linux下如何設定環境變數
Linux下如何查看TCP串連狀態
LISTEN: 偵聽來自遠方的TCP連接埠的串連請求 listen SYN-SENT: 再發送串連請求後等待匹配的串連請求 syn-sentSYN-RECEIVED:再收到和發送一個串連請求後等待對方對串連請求的確認 syn-receivedESTABLISHED: 代表一個開啟的串連FIN-WAIT-1: 等待遠程TCP串連插斷要求,或先前的串連插斷要求的確認FIN-WAIT-2: 從遠程TCP等待串連插斷要求CLOSE-WAIT: 等待從本機使用者發來的串連插斷要求CLOSING: 等待遠程TCP對串連中斷的確認LAST-ACK: 等待原來的發向遠程TCP的串連插斷要求的確認TIME-WAIT: 等待足夠的時間以確保遠程TCP接收到串連插斷要求的確認CLOSED: 沒有任何串連狀態
- 簡述一次HTTP請求的基本流程
- 什麼是JDBC,為什麼需要什麼是JDBC?實現原理是什嗎?
- Get和Post的區別
- Cookie和Session的區別,分別用於什麼情境
- 為什麼需要編碼?UTF-8和GBK是如何進行編碼的
- 分別介紹下JDK,JRE和JVM
HashMap的資料結構是什嗎?如何?的。和HashTable,ConcurrentHashMap的區別
- 索引有什麼用?如何建索引?
- ArrayList是如何?的,ArrayList和LinkedList的區別?ArrayList如何?擴容。
- equals方法實現
- 物件導向
- 線程狀態,BLOCKED和WAITING有什麼區別
- JVM如何載入位元組碼檔案
- JVM GC,GC演算法。
什麼情況會出現Full GC,什麼情況會出現yong GC。
JVM記憶體模型
Java記憶體模型,指Java程式在運行時記憶體的模型,而Java代碼運行在Java虛擬機器上,所以也就指Java虛擬機器的運行時記憶體模型。
- Java運行時資料區
- 事務的實現原理
技術深度
- 有沒有看過JDK源碼,看過的類實現原理是什麼。
- HTTP協議
- TCP協議
- 一致性Hash演算法
- JVM如何載入位元組碼檔案
- 類載入器如何卸載位元組碼
- IO和NIO的區別,NIO優點
- Java線程池的實現原理,keepAliveTime等參數的作用。
- HTTP串連池實現原理
- 資料庫連接池實現原理
- 資料庫的實現原理
技術架構
- 看過哪些開源架構的源碼
- 為什麼要用Redis,Redis有哪些優缺點?Redis如何?擴容?
- Netty是如何使用線程池的,為什麼這麼使用
- 為什麼要使用Spring,Spring的優缺點有哪些
- Spring的IOC容器初始化流程
- Spring的IOC容器實現原理,為什麼可以通過byName和ByType找到Bean
- Spring AOP實現原理
- 訊息中介軟體是如何?的,技術痛點有哪些
系統架構
- 如何搭建一個高可用系統
- 哪些設計模式可以增加系統的可擴充性
- 介紹設計模式,如模板模式,命令模式,策略模式,適配器模式、橋接模式、裝飾模式,觀察者模式,狀態模式,訪問者模式。
- 抽象能力,怎麼提高研發效率。
- 什麼是高內聚低耦合,請舉例子如何?
- 什麼情況用介面,什麼情況用訊息
- 如果AB兩個系統互相依賴,如何解除依賴
- 如何寫一篇設計文檔,目錄是什麼
- 什麼情境應該拆分系統,什麼情境應該合并系統
- 系統和模組的區別,分別在什麼情境下使用
分布式系統
- 分散式交易,兩階段交易認可。
- 如何?分布式鎖
- 如何?分布式Session
- 如何保證訊息的一致性
- 負載平衡
- 正向 Proxy(用戶端代理)和反向 Proxy(伺服器端代理)
- CDN實現原理
- 怎麼提升系統的QPS和輸送量
實戰能力
- 有沒有處理過線上問題?出現記憶體泄露,CPU利用率標高,應用無響應時如何處理的。
- 開發中有沒有遇到什麼技術問題?如何解決的
- 如果有幾十億的白名單,每天白天需要高並發查詢,晚上需要更新一次,如何設計這個功能。
- 新浪微博是如何?把微博推給訂閱者
- Google是如何在一秒內把搜尋結果返回給使用者的。
- 12306網站的訂票系統如何?,如何保證不會票不被超賣。
- 如何?一個秒殺系統,保證只有幾位使用者能買到某件商品。
軟能力
- 如何學習一項新技術,比如如何學習Java的,重點學習什麼
- 有關注哪些新的技術
- 工作任務非常多非常雜時如何處理
- 項目出現延遲如何處理
- 和同事的設計思路不一樣怎麼處理
- 如何保證開發品質
- 職業規劃是什嗎?短期,長期目標是什麼
- 團隊的規劃是什麼
- 能介紹下從工作到現在自己的成長在那裡
基礎概念
- 多個線程可同時操作一個資料,為了保證該資料的準確性,可將操作該資料的部分改為同步。
- 並發:在 作業系統中,是指一個時間段中有幾個程式都處於已啟動運行到運行完畢之間,且這幾個程式都是在同一個 處理機上運行。其中兩種並發關係分別是同步和互斥
- 互斥:進程間相互排斥的使用臨界資源的現象,就叫互斥。
- 同步: 進程之間的關係不是相互排斥臨界資源的關係,而是相互依賴的關係。進一步的說明:就是前一個進程的輸出作為後一個進程的輸入,當第一個進程沒有輸出時第二個進程必須等待。具有同步關係的一組並發進程相互發送的資訊稱為訊息或事件。
- 其中並發又有偽並發和真並發,偽並發是指單核處理器的並發,真並發是指多核處理器的並發。
- 並行:在單一處理器中多道程式設計系統中,進程被交替執行,表現出一種並發的外部特種;在多處理器系統中,進程不僅可以交替執行,而且可以重疊執行。在多處理器上的程式才可實現平行處理。從而可知,並行是針對多處理器而言的。並行是同時發生的多個並發事件,具有並發的含義,但並發不一定並行,也亦是說並發事件之間不一定要同一時刻發生。
- 多線程:多線程是程式設計的邏輯層概念,它是進程中並發啟動並執行一段代碼。多線程可以實現線程間的切換執行。
- 非同步:非同步和同步是相對的,同步就是順序執行,執行完一個再執行下一個,需要等待、協調運行。非同步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成後再工作。線程就是實現非同步一個方式。非同步是讓調用方法的主線程不需要同步等待另一線程的完成,從而可以讓主線程幹其它的事情。
- 非同步和多線程並不是一個同等關係,非同步是最終目的,多線程只是我們實現非同步一種手段。非同步是當一個調用請求發送給被調用者,而調用者不用等待其結果的返回而可以做其它的事情。實現非同步可以採用多線程技術或則交給另外的進程來處理。
- constructor在一個對象被new時執行
- @java中關於繼承的描述:一個子類只能繼承一個父類; 繼承具有傳遞性;父類一般具有通用性,子類更具體。
- 當一個對象不再被引用後就成為垃圾可以被回收,但是線程就算沒有被引用也可以獨立啟動並執行。
Java基礎-1