Java 中,int 類型變量的長度是一個固定值,與平臺無關,都是 32 位。意思就 是說,在 32 位 和 64 位 的 Java 虛擬機中,int 類型的長度是相同的。html
Serial 與 Parallel 在 GC 執行的時候都會引發 stop-the-world。它們之間主要 不一樣 serial 收集器是默認的複製收集器,執行 GC 的時候只有一個線程,而 parallel 收集器使用多個 GC 線程來執行。java
32 位和 64 位的 JVM 中,int 類型變量的長度是相同的,都是 32 位或者 4 個字節。面試
雖然 WeakReference 與 SoftReference 都有利於提升 GC 和 內存的效率, 可是 WeakReference ,一旦失去最後一個強引用,就會被 GC 回收,而軟引用 雖然不能阻止被回收,可是能夠延遲到 JVM 內存不足的時候。算法
WeakHashMap 的工做與正常的 HashMap 相似,可是使用弱引用做爲 key, 意思就是當 key 對象沒有任何引用時,key/value 將會被回收。數組
當你將你的應用從 32 位的 JVM 遷移到 64 位的 JVM 時,因爲對象的指針從 32 位增長到了 64 位,所以堆內存會忽然增長,差很少要翻倍。這也會對 CPU 緩存(容量比內存小不少)的數據產生不利的影響。由於,遷移到 64 位的 JVM 主要動機在於能夠指定最大堆大小,經過壓縮 OOP 能夠節省必定的內存。經過 -XX:+UseCompressedOops 選項,JVM 會使用 32 位的 OOP,而不是 64 位 的 OOP。緩存
你能夠檢查某些系統屬性如 sun.arch.data.model 或 os.arch 來獲取該信息。數據結構
理論上說上 32 位的 JVM 堆內存能夠到達 2^32,即 4GB,但實際上會比這個 小不少。不一樣操做系統之間不一樣,如 Windows 系統大約 1.5 GB,Solaris 大約 3GB。64 位 JVM 容許指定最大的堆內存,理論上能夠達到 2^64,這是一個非 常大的數字,實際上你能夠指定堆內存大小到 100GB。甚至有的 JVM,如 Azul, 堆內存到 1000G 都是可能的。框架
JRE 表明 Java 運行時(Java run-time),是運行 Java 引用所必須的。JDK 代 表 Java 開發工具(Java development kit),是 Java 程序的開發工具,如 Java 編譯器,它也包含 JRE。JVM 表明 Java 虛擬機(Java virtual machine),它 的責任是運行 Java 應用。JIT 表明即時編譯(Just In Time compilation),當 代碼執行的次數超過必定的閾值時,會將 Java 字節碼轉換爲本地代碼,如,主 要的熱點代碼會被準換爲本地代碼,這樣有利大幅度提升 Java 應用的性能。編輯器
當經過 Java 命令啓動 Java 進程的時候,會爲它分配內存。內存的一部分用於 建立堆空間,當程序中建立對象的時候,就從對空間中分配內存。GC 是 JVM 內 部的一個進程,回收無效對象的內存用於未來的分配ide
JVM 底層面試題及答案
不能,雖然你能夠調用 System.gc() 或者 Runtime.gc(),可是沒有辦法保證 GC 的執行。
能夠經過 java.lang.Runtime 類中與內存相關方法來獲取剩餘的內存,總內存及 最大堆內存。經過這些方法你也能夠獲取到堆使用的百分比及堆內存的剩餘空間。 Runtime.freeMemory() 方法返回剩餘空間的字節數,Runtime.totalMemory() 方法總內存的字節數,Runtime.maxMemory() 返回最大內存的字節數。
JVM 中堆和棧屬於不一樣的內存區域,使用目的也不一樣。棧經常使用於保存方法幀和局 部變量,而對象老是在堆上分配。棧一般都比堆小,也不會在多個線程之間共享, 而堆被整個 JVM 的全部線程共享。
關於內存的的面試問題和答案
Java 基本概念面試題
若是 a 和 b 都是對象,則 a==b 是比較兩個對象的引用,只有當 a 和 b 指 向的是堆中的同一個對象纔會返回 true,而 a.equals(b) 是進行邏輯比較,因此 一般須要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方 法,因此能夠用於兩個不一樣對象,可是包含的字母相同的比較。
hashCode() 方法是相應對象整型的 hash 值。它經常使用於基於 hash 的集合類, 如 Hashtable、HashMap、LinkedHashMap 等等。它與 equals() 方法關係特 別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的對象,必須具備 相同的 hash code。
final 是一個修飾符,能夠修飾變量、方法和類。若是 final 修飾變量,意味着該 變量的值在初始化後不能被改變。finalize 方法是在對象被回收以前調用的方法, 給對象本身最後一個復活的機會,可是何時調用 finalize 沒有保證。finally 是一個關鍵字,與 try 和 catch 一塊兒用於異常的處理。finally 塊必定會被執行, 不管在 try 塊中是否有發生異常。
公共靜態不可變(public static final )變量也就是咱們所說的編譯期常量,這裏 的 public 可選的。實際上這些變量在編譯時會被替換掉,由於編譯器知道這些 變量的值,而且知道這些變量在運行時不能改變。這種方式存在的一個問題是你 使用了一個內部的或第三方庫中的公有編譯時常量,可是這個值後面被其餘人改 變了,可是你的客戶端仍然在使用老的值,甚至你已經部署了一個新的 jar。爲了 避免這種狀況,當你在更新依賴 JAR 文件時,確保從新編譯你的程序。
Java 集合框架的面試題
這部分也包含數據結構、算法及數組的面試問題
List 是一個有序集合,容許元素重複。它的某些實現能夠提供基於下標值的常量 訪問時間,可是這不是 List 接口保證的。Set 是一個無序集合。
poll() 和 remove() 都是從隊列中取出一個元素,可是 poll() 在獲取元素失敗 的時候會返回空,可是 remove() 失敗的時候會拋出異常。
PriorityQueue 保證最高或者最低優先級的的元素老是在隊列頭部,可是 LinkedHashMap 維持的順序是元素插入的順序。當遍歷一個 PriorityQueue 時,沒有任何順序保證,可是 LinkedHashMap 課保證遍歷順序是元素插入的順 序。
最明顯的區別是 ArrrayList 底層的數據結構是數組,支持隨機訪問,而 LinkedList 的底層數據結構書鏈表,不支持隨機訪問。使用下標訪問一個元素, ArrayList 的時間複雜度是 O(1),而 LinkedList 是 O(n)。更多細節的討論參見 答案。
你可使用有序集合,如 TreeSet 或 TreeMap,你也可使用有順序的的集合, 如 list,而後經過 Collections.sort() 來排序。
你可使用 Arrays.toString() 和 Arrays.deepToString() 方法來打印數組。由 於數組沒有實現 toString() 方法,因此若是將數組傳遞給 System.out.println(方法,將沒法打印出數組的內容,可是 Arrays.toString() 能夠打印每一個元素。
是雙向鏈表,你能夠檢查 JDK 的源碼。在 Eclipse,你可使用快捷鍵 Ctrl + T, 直接在編輯器中打開該類。
Java 中的 TreeMap 是使用紅黑樹實現的。
這兩個類有許多不一樣的地方,下面列出了一部分:
a) Hashtable 是 JDK 1 遺留下來的類,而 HashMap 是後來增長的。
b)Hashtable 是同步的,比較慢,但 HashMap 沒有同步策略,因此會更快。
c)Hashtable 不容許有個空的 key,可是 HashMap 容許出現一個 null key。
更多的不一樣之處參見答案。
HashSet 的內部採用 HashMap 來實現。因爲 Map 須要 key 和 value,因此 全部 key 的都有一個默認 value。相似於 HashMap,HashSet 不容許重複的 key,只容許有一個 null key,意思就是 HashSet 中只容許存儲一個 null 對象。
該問題的關鍵在於面試者使用的是 ArrayList 的 remove() 仍是 Iterator 的 remove()方法。這有一段示例代碼,是使用正確的方式來實如今遍歷的過程當中移 除元素,而不會出現 ConcurrentModificationException 異常的示例代碼
能夠,你能夠寫一個本身的容器類。若是你想使用 Java 中加強的循環來遍歷, 你只須要實現 Iterable 接口。若是你實現 Collection 接口,默認就具備該屬性。
在 Java 7 中,ArrayList 的默認大小是 10 個元素,HashMap 的默認大小是 16 個元素(必須是 2 的冪)。這就是 Java 7 中 ArrayList 和 HashMap 類的 代碼片斷:
1// from ArrayList.java JDK 1.7 2private static final int DEFAULT_CAPACITY = 10; 3//from HashMap.java JDK 7 4static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
有可能,兩個不相等的對象可能會有相同的 hashcode 值,這就是爲何在 hashmap 中會有衝突。相等 hashcode 值的規定只是說若是兩個對象相等,必 須有相同的 hashcode 值,可是沒有關於不相等對象的任何規定。
不能,根據 hash code 的規定,這是不可能的。
答案
http://javarevisited.blogspot... ple.html
不行,由於對象的 hashcode 值必須是相同的。參見答案獲取更多關於 Java 中 重寫 hashCode() 方法的知識。
Comparable 接口用於定義對象的天然順序,而 comparator 一般用於定義用戶 定製的順序。Comparable 老是隻有一個,可是能夠有多個 comparator 來定義 對象的順序。
由於有強制的規範指定須要同時重寫 hashcode 與 equal 是方法,許多容器類, 如 HashMap、HashSet 都依賴於 hashcode 與 equals 的規定。