JVM&NIO&HashMap簡單問

 

JVM&NIO&HashMap簡單問面試

 

背景:前幾天在網上看到關於JVM&NIO&HashMap的一些連環炮的面試題,整理下以備不時之需。算法

 

1、JVM設計模式

Java的虛擬機的面試內容主要包括GC、類加載機制和內存三大部分。以下是一個一個GC部分簡單的連環炮:數據結構

問:併發

何時一個對象會被GC?高併發

答:post

當沒有任何對象的引用指向該對象時 + 在下次垃圾回收週期來到時,對象纔會被回收。性能

又問:
爲何要在這種時候對象纔會被GC?優化

答:spa

由於JVM會自動回收沒有被引用的對象來釋放空間,從而解決內存不足問題。

又問:
GC策略都有哪些分類?

答:
一、標記-清除算法。
二、複製算法。
三、標記整理算法。

又問:
這些策略分別都有什麼優點and劣勢?都適用於什麼場景?

答:

一、標記-清除算法採用從根集合進行掃描,對存活的對象進行標記,標記完畢後再掃描整個空間中未被標記的對象,對其進行直接回收。其不須要進行對象的移動,而且僅對不存活的對象進行處理,在存活的對象比較多的狀況下極爲高效,但因爲標記-清除算法只回收不存活的對象,並無對還存活的對象進行整理,所以會致使內存碎片。

二、複製算法將內存劃分爲兩個分區,使用此算法時,全部動態分配的對象都只能分配在其中一個區間(活動區間),而另一個區間(空間區間)則是空閒區間。其採用從根集合掃描,將存活的對象複製到空閒區間,當掃描完畢活動區間後,會將活動區間一次性所有回收,此時本來的空閒區間變成了活動區間,下次GC的時候又會重複剛纔的操做,以此循環。另外,複製算法在存活對象比較少的時候,極爲高效,可是帶來的成本是犧牲一半的內存空間用於進行對象的移動,因此複製算法的使用場景必須是對象的存活率很是低才行,並且最重要的是咱們須要克服50%內存的浪費。

三、標記整理算法採用標記-清除算法同樣的方式進行對象的標記、清除,但在回收不存活的對象佔用的空間後,會將全部存活的對象往左端空閒空間移動,並更新對應的指針,其算法是在標記-清除算法之上,又進行了對象的移動排序整理,所以成本更高,但卻解決了內存碎片的問題。

四、JVM爲了優化內存的回收,採用的是分代回收的方式,對於新生代內存的回收(Minor GC)主要採用複製算法;而對於老年代的回收(Major GC),大多采用標記整理算法。
在 Java 中,堆被劃分紅兩個不一樣的區域:新生代 ( Young )、老年代 ( Old );新生代 ( Young ) 又被劃分爲三個區域:Eden、From Survivor、To Survivor;堆大小 = 新生代 + 老年代。其中,堆的大小能夠經過參數 –Xms、-Xmx 來指定。

2、NIO

簡單介紹下IO包和NIO包中的內容:
IO包:
一、按照數據流的方向不一樣能夠分爲:輸入流(InputStream,Reader)和輸出流(OutputStream,Writer)。
二、按照處理數據單位不一樣能夠分爲:字節流(InputStream,OutputStream)和字符流(Reader,Writer)。
三、按照實現功能不一樣能夠分爲:節點流(四大基礎流...)和處理流(就是在節點流外面再套一層,好比BufferedReader,BufferedWriter...)。
注:這裏的輸入和輸出都是針對程序自己而言,而字節和字符就是一個是8位的二進制,另外一個是16位的二進制;而節點流和處理流的區別就在於傳數據的單位不一樣。

NIO:

首先NIO模型要熟悉,特別是其中的selector必定要很是清楚它的職責和實現原理。其實NIO的核心是IO線程池,必定要記住這個關鍵點。面試官可能也會問你IO包的設計模式(裝飾器模式),爲何要這樣設計?
NIO簡介:Non-blocking I/O 或 New I/O;非阻塞IO,做爲原始IO的補充,爲了應對高性能高併發的應用場景。
NIO詳解:https://blog.csdn.net/qq_28303495/article/details/89514690

3、Java的數據結構相關的類實現原理

好比LinkedList,ArrayList,HashMap,TreeMap這一類的,如下簡單模擬一個數據結構的連環炮。

問:

HashMap是否是有序的?
答: 
HashMap是無序集合。

又問:
有沒有有順序的Map實現類?
答:
TreeMap和LinkedHashMap。

又問:

TreeMap和LinkedHashMap是如何保證它的順序的?
答:
LinkedHashMap內部增長了一個鏈表,用於存放元素的順序,其是根據元素增長或者訪問的前後順序進行排序的;TreeMap它實現了SortedMap接口,能夠對元素進行排序,其是根據元素的Key進行排序的,也就是基於元素的固有順序(由Comparator或者Comparable肯定)。

又問:
你以爲它們兩個哪一個的有序實現比較好?
答:
分需求和場景考慮吧:
TreeMap取出來的是排序後的鍵值對,若是按天然順序或自定義順序遍歷鍵,那麼TreeMap會更好;若是須要輸出的順序和輸入的順序形同,那麼用LinkedHashMap比較好;

又問:

適可而止 見好就收

相關文章
相關標籤/搜索