天天看點

Andrid面試題彙總

Android基礎

  1. View的繪制流程;自定義View如何考慮機型适配;自定義View的事件分發機制;View和ViewGroup分别有哪些事件分發相關的回調方法;自定義View如何提供擷取View屬性的接口;
  2. Art和Dalvik對比;虛拟機原理,如何自己設計一個虛拟機(記憶體管理,類加載,雙親委派);JVM記憶體模型及類加載機制;記憶體對象的循環引用及避免
  3. 記憶體回收機制與GC算法(各種算法的優缺點以及應用場景);GC原理時機以及GC對象;記憶體洩露場景及解決方法;OOM的避免及解決方法
  4. 四大元件及生命周期;ContentProvider的權限管理(讀寫分離,權限控制-精确到表級,URL控制);Activity的四種啟動模式對比;Activity狀态儲存于恢複
  5. Fragment生命周期;Fragment狀态儲存
  6. startActivityForResult是哪個類的方法,在什麼情況下使用,如果在Adapter中使用應該如何解耦
  7. AsyncTask原理及不足;IntentService原理
  8. AstncTask+HttpClient與AsyncHttpClient有什麼差別
  9. 如何保證一個背景服務不被殺死;比較省電的方式是什麼
  10. 如何通過廣播攔截和abort一條短信;廣播是否可以請求網絡;廣播引起anr的時間限制
  11. 程序間通信,AIDL
  12. Handler機制及底層實作
  13. Binder機制及底層實作
  14. ApplicationContext和ActivityContext的差別
  15. 一張Bitmap所占記憶體以及記憶體占用的計算
  16. 對于應用更新這塊是如何做的?(灰階,強制更新,分區域更新)
  17. 混合開發,RN,weex,H5,小程式(做Android的了解一些前端js等還是很有好處的)
  18. 說一款你認為目前比較火的應用并設計(直播APP)

Java基礎

  1. 集合類以及集合架構;HashMap與HashTable實作原理,線程安全性,hash沖突及處理算法;ConcurrentHashMap
  2. 程序和線程的差別;多線程與線程池
  3. 資料一緻性如何保證;Synchronized關鍵字,類鎖,方法鎖,重入鎖
  4. 同步的方法;多程序開發以及多程序應用場景
  5. 伺服器隻提供資料接收接口,在多線程或多程序條件下,加小編微信:AMEPRE,如何保證資料的有序到達
  6. ThreadLocal原理,實作及如何保證Local屬性
  7. String StringBuilder StringBuffer對比
  8. 接口與回調;回調的原理;寫一個回調demo;
  9. 泛型原理,舉例說明;解析與分派
  10. 抽象類與接口的差別;應用場景;抽象類是否可以沒有方法和屬性
  11. 靜态屬性和靜态方法是否可以被繼承?是否可以被重寫?原因
  12. 修改對象A的equals方法的簽名,那麼使用HashMap存放這個對象執行個體的時候,會調用哪個equals方法

資料結構與算法

  1. 堆和棧在記憶體中的差別是什麼(資料結構方面以及實際實作方面)
  2. 最快的排序算法是哪個?給阿裡2萬多名員工按年齡排序應該選擇哪個算法?堆和樹的差別;寫出快排代碼;連結清單逆序代碼
  3. 求1000以内的水仙花數以及40億以内的水仙花數
  4. 子串包含問題(KMP 算法)寫代碼實作
  5. 萬億級别的兩個URL檔案A和B,如何求出A和B的差集C,(Bit映射->hash分組->多檔案讀寫效率->磁盤尋址以及應用層面對尋址的優化)
  6. 蟻群算法與蒙特卡洛算法
  7. 寫出你所知道的排序算法及時空複雜度,穩定性
  8. 百度POI中如何試下查找最近的商家功能(坐标鏡像+R樹)

其他

  1. 死鎖的四個必要條件
  2. 常見編碼方式;utf-8編碼中的中文占幾個位元組;int型幾個位元組
  3. 實作一個Json解析器(可以通過正則提高速度)
  4. MVC MVP MVVM; 常見的設計模式;寫出觀察者模式的代碼
  5. TCP的3次握手和四次揮手;TCP與UDP的差別
  6. HTTP協定;HTTP1.0與2.0的差別;HTTP封包結構
  7. HTTP與HTTPS的差別以及如何實作安全性

非技術問題彙總

  1. 研究比較深入的領域有哪些
  2. 對業内資訊的關注管道有哪些
  3. 最近都讀哪些書
  4. 自己最擅長的技術點,最感興趣的技術領域和技術點
  5. 項目中用了哪些開源庫,如何避免因為引入開源庫而導緻的安全性和穩定性問題
  6. 實習過程中做了什麼,有什麼産出
  7. 5枚硬币,2正3反如何劃分為兩堆然後通過翻轉讓兩堆中正面向上的硬币和反面向上的硬币個數相同
  8. 時針走一圈,時針分針重合幾次
  9. N * N的方格紙,裡面有多少個正方形
  10. 現在下載下傳速度很慢,試從網絡協定的角度分析原因,并優化(網絡的5層都可以涉及)

HR問題彙總

  1. 講一件你印象最深的一件事情
  2. 介紹一個你影響最深的項目
  3. 介紹你最熱愛最擅長的專業領域
  4. 公司實習最大的收獲是什麼
  5. 自己的優點和缺點是什麼?舉例說明
  6. 你的學習方法是什麼樣的?實習過程中如何學習?實習項目中遇到的最大困難是什麼以及如何解決的
  7. 說一件最能證明你能力的事情
  8. 項目中遇到最大的困難是什麼?如何解決的
  9. 你的職業規劃以及個人目标;未來發展路線及求職定位
  10. 評價下自己,評價下自己的技術水準,個人代碼量如何
  11. 通過哪些管道了解的招聘資訊,其他同學都投了哪些公司
  12. 業餘都有哪些愛好
  13. 目前的offer狀況;如果BATH都給了offer該如何選
  14. 你對一份工作更看重哪些方面?平台,技術,氛圍,城市,money
  15. 理想薪資範圍;杭州崗和北京崗選哪個
  16. 理想中的工作環境是什麼
  17. 實習過程中周圍同僚/同學有哪些值得學習的地方
  18. 家人對你的工作期望及自己的工作期望
  19. 若上司在公開會議上誤會你了,該如何解決
  20. 是否可以實習,可以實習多久
  21. 你看中公司的什麼?或者公司的那些方面最吸引你?

列出這份 Java 面試問題清單包含的主題:

多線程,并發及線程基礎

資料類型轉換的基本原則

垃圾回收(GC)

Java 集合架構

數組

字元串

GOF 設計模式

SOLID (單一功能、開閉原則、裡氏替換、接口隔離以及依賴反轉)設計原則

抽象類與接口

Java 基礎,如 equals 和 hashcode

泛型與枚舉

Java IO 與 NIO

常用網絡協定

Java 中的資料結構和算法

正規表達式

JVM 底層

Java 最佳實踐

JDBC

Date, Time 與 Calendar

Java 處理 XML

JUnit

程式設計

120 大 Java 面試題及答案

現在是時候給你展示我近 5 年從各種面試中收集來的 120 個問題了。我确定你在自己的面試中見過很多這些問題,很多問題你也能正确回答。

多線程、并發及線程的基礎問題

1)Java 中能建立 volatile 數組嗎?

能,Java 中可以建立 volatile 類型數組,不過隻是一個指向數組的引用,而不是整個數組。我的意思是,如果改變引用指向的數組,将會受到 volatile 的保護,但是如果多個線程同時改變數組的元素,volatile 标示符就不能起到之前的保護作用了。

2)volatile 能使得一個非原子操作變成原子操作嗎?

一個典型的例子是在類中有一個 long 類型的成員變量。如果你知道該成員變量會被多個線程通路,如計數器、價格等,你最好是将其設定為 volatile。為什麼?因為 Java 中讀取 long 類型變量不是原子的,需要分成兩步,如果一個線程正在修改該 long 變量的值,另一個線程可能隻能看到該值的一半(前 32 位)。但是對一個 volatile 型的 long 或 double 變量的讀寫是原子。

3)volatile 修飾符的有過什麼實踐?

一種實踐是用 volatile 修飾 long 和 double 變量,使其能按原子類型來讀寫。double 和 long 都是64位寬,是以對這兩種類型的讀是分為兩部分的,第一次讀取第一個 32 位,然後再讀剩下的 32 位,這個過程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫是原子的。volatile 修複符的另一個作用是提供記憶體屏障(memory barrier),例如在分布式架構中的應用。簡單的說,就是當你寫一個 volatile 變量之前,Java 記憶體模型會插入一個寫屏障(write barrier),讀一個 volatile 變量之前,會插入一個讀屏障(read barrier)。意思就是說,在你寫一個 volatile 域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數值的更新對所有線程是可見的,因為記憶體屏障會将其他所有寫的值更新到緩存。

4)volatile 類型變量提供什麼保證?(答案)

volatile 變量提供順序和可見性保證,例如,JVM 或者 JIT為了獲得更好的性能會對語句重排序,但是 volatile 類型變量即使在沒有同步塊的情況下指派也不會與其他語句重排序。 volatile 提供 happens-before 的保證,確定一個線程的修改能對其他線程是可見的。某些情況下,volatile 還能提供原子性,如讀 64 位資料類型,像 long 和 double 都不是原子的,但 volatile 類型的 double 和 long 就是原子的。

5) 10 個線程和 2 個線程的同步代碼,哪個更容易寫?

從寫代碼的角度來說,兩者的複雜度是相同的,因為同步代碼與線程數量是互相獨立的。但是同步政策的選擇依賴于線程的數量,因為越多的線程意味着更大的競争,是以你需要利用同步技術,如鎖分離,這要求更複雜的代碼和專業知識。

6)你是如何調用 wait()方法的?使用 if 塊還是循環?為什麼?(答案)

wait() 方法應該在循環調用,因為當線程擷取到 CPU 開始執行的時候,其他條件可能還沒有滿足,是以在處理前,循環檢測條件是否滿足會更好。下面是一段标準的使用 wait 和 notify 方法的代碼:

參見 Effective Java 第 69 條,擷取更多關于為什麼應該在循環中來調用 wait 方法的内容。

7)什麼是多線程環境下的僞共享(false sharing)?

僞共享是多線程系統(每個處理器有自己的局部緩存)中一個衆所周知的性能問題。僞共享發生在不同處理器的上的線程對變量的修改依賴于相同的緩存行,如下圖所示:

Andrid面試題彙總

有經驗程式員的 Java 面試題

僞共享問題很難被發現,因為線程可能通路完全不同的全局變量,記憶體中卻碰巧在很相近的位置上。如其他諸多的并發問題,避免僞共享的最基本方式是仔細審查代碼,根據緩存行來調整你的資料結構。

8)什麼是 Busy spin?我們為什麼要使用它?

Busy spin 是一種在不釋放 CPU 的基礎上等待事件的技術。它經常用于避免丢失 CPU 緩存中的資料(如果線程先暫停,之後在其他CPU上運作就會丢失)。是以,如果你的工作要求低延遲,并且你的線程目前沒有任何順序,這樣你就可以通過循環檢測隊列中的新消息來代替調用 sleep() 或 wait() 方法。它唯一的好處就是你隻需等待很短的時間,如幾微秒或幾納秒。LMAX 分布式架構是一個高性能線程間通信的庫,該庫有一個 BusySpinWaitStrategy 類就是基于這個概念實作的,使用 busy spin 循環 EventProcessors 等待屏障。

9)Java 中怎麼擷取一份線程 dump 檔案?

在 Linux 下,你可以通過指令 kill -3 PID (Java 程序的程序 ID)來擷取 Java 應用的 dump 檔案。在 Windows 下,你可以按下 Ctrl + Break 來擷取。這樣 JVM 就會将線程的 dump 檔案列印到标準輸出或錯誤檔案中,它可能列印在控制台或者日志檔案中,具體位置依賴應用的配置。如果你使用Tomcat。

10)Swing 是線程安全的?(答案)

不是,Swing 不是線程安全的。你不能通過任何線程來更新 Swing 元件,如 JTable、JList 或 JPanel,事實上,它們隻能通過 GUI 或 AWT 線程來更新。這就是為什麼 Swing 提供 invokeAndWait() 和 invokeLater() 方法來擷取其他線程的 GUI 更新請求。這些方法将更新請求放入 AWT 的線程隊列中,可以一直等待,也可以通過異步更新直接傳回結果。你也可以在參考答案中檢視和學習到更詳細的内容。

11)什麼是線程局部變量?(答案)

線程局部變量是局限于線程内部的變量,屬于線程自身所有,不在多個線程間共享。Java 提供 ThreadLocal 類來支援線程局部變量,是一種實作線程安全的方式。但是在管理環境下(如 web 伺服器)使用線程局部變量的時候要特别小心,在這種情況下,工作線程的生命周期比任何應用變量的生命周期都要長。任何線程局部變量一旦在工作完成後沒有釋放,Java 應用就存在記憶體洩露的風險。

12)用 wait-notify 寫一段代碼來解決生産者-消費者問題?(答案)

請參考答案中的示例代碼。隻要記住在同步塊中調用 wait() 和 notify()方法,如果阻塞,通過循環來測試等待條件。

13) 用 Java 寫一個線程安全的單例模式(Singleton)?(答案)

請參考答案中的示例代碼,這裡面一步一步教你建立一個線程安全的 Java 單例類。當我們說線程安全時,意思是即使初始化是在多線程環境中,仍然能保證單個執行個體。Java 中,使用枚舉作為單例類是最簡單的方式來建立線程安全單例模式的方式。

14)Java 中 sleep 方法和 wait 方法的差別?(答案)

雖然兩者都是用來暫停目前運作的線程,但是 sleep() 實際上隻是短暫停頓,因為它不會釋放鎖,而 wait() 意味着條件等待,這就是為什麼該方法要釋放鎖,因為隻有這樣,其他等待的線程才能在滿足條件時擷取到該鎖。

15)什麼是不可變對象(immutable object)?Java 中怎麼建立一個不可變對象?(答案)

不可變對象指對象一旦被建立,狀态就不能再改變。任何修改都會建立一個新的對象,如 String、Integer及其它包裝類。詳情參見答案,一步一步指導你在 Java 中建立一個不可變的類。

16)我們能建立一個包含可變對象的不可變對象嗎?

是的,我們是可以建立一個包含可變對象的不可變對象的,你隻需要謹慎一點,不要共享可變對象的引用就可以了,如果需要變化時,就傳回原對象的一個拷貝。最常見的例子就是對象中包含一個日期對象的引用

有經驗程式員的 Java 面試題

僞共享問題很難被發現,因為線程可能通路完全不同的全局變量,記憶體中卻碰巧在很相近的位置上。如其他諸多的并發問題,避免僞共享的最基本方式是仔細審查代碼,根據緩存行來調整你的資料結構。

8)什麼是 Busy spin?我們為什麼要使用它?

Busy spin 是一種在不釋放 CPU 的基礎上等待事件的技術。它經常用于避免丢失 CPU 緩存中的資料(如果線程先暫停,之後在其他CPU上運作就會丢失)。是以,如果你的工作要求低延遲,并且你的線程目前沒有任何順序,這樣你就可以通過循環檢測隊列中的新消息來代替調用 sleep() 或 wait() 方法。它唯一的好處就是你隻需等待很短的時間,如幾微秒或幾納秒。LMAX 分布式架構是一個高性能線程間通信的庫,該庫有一個 BusySpinWaitStrategy 類就是基于這個概念實作的,使用 busy spin 循環 EventProcessors 等待屏障。

9)Java 中怎麼擷取一份線程 dump 檔案?

在 Linux 下,你可以通過指令 kill -3 PID (Java 程序的程序 ID)來擷取 Java 應用的 dump 檔案。在 Windows 下,你可以按下 Ctrl + Break 來擷取。這樣 JVM 就會将線程的 dump 檔案列印到标準輸出或錯誤檔案中,它可能列印在控制台或者日志檔案中,具體位置依賴應用的配置。如果你使用Tomcat。

10)Swing 是線程安全的?(答案)

不是,Swing 不是線程安全的。你不能通過任何線程來更新 Swing 元件,如 JTable、JList 或 JPanel,事實上,它們隻能通過 GUI 或 AWT 線程來更新。這就是為什麼 Swing 提供 invokeAndWait() 和 invokeLater() 方法來擷取其他線程的 GUI 更新請求。這些方法将更新請求放入 AWT 的線程隊列中,可以一直等待,也可以通過異步更新直接傳回結果。你也可以在參考答案中檢視和學習到更詳細的内容。

11)什麼是線程局部變量?(答案)

線程局部變量是局限于線程内部的變量,屬于線程自身所有,不在多個線程間共享。Java 提供 ThreadLocal 類來支援線程局部變量,是一種實作線程安全的方式。但是在管理環境下(如 web 伺服器)使用線程局部變量的時候要特别小心,在這種情況下,工作線程的生命周期比任何應用變量的生命周期都要長。任何線程局部變量一旦在工作完成後沒有釋放,Java 應用就存在記憶體洩露的風險。

12)用 wait-notify 寫一段代碼來解決生産者-消費者問題?(答案)

請參考答案中的示例代碼。隻要記住在同步塊中調用 wait() 和 notify()方法,如果阻塞,通過循環來測試等待條件。

13) 用 Java 寫一個線程安全的單例模式(Singleton)?(答案)

請參考答案中的示例代碼,這裡面一步一步教你建立一個線程安全的 Java 單例類。當我們說線程安全時,意思是即使初始化是在多線程環境中,仍然能保證單個執行個體。Java 中,使用枚舉作為單例類是最簡單的方式來建立線程安全單例模式的方式。

14)Java 中 sleep 方法和 wait 方法的差別?(答案)

雖然兩者都是用來暫停目前運作的線程,但是 sleep() 實際上隻是短暫停頓,因為它不會釋放鎖,而 wait() 意味着條件等待,這就是為什麼該方法要釋放鎖,因為隻有這樣,其他等待的線程才能在滿足條件時擷取到該鎖。

15)什麼是不可變對象(immutable object)?Java 中怎麼建立一個不可變對象?(答案)

不可變對象指對象一旦被建立,狀态就不能再改變。任何修改都會建立一個新的對象,如 String、Integer及其它包裝類。詳情參見答案,一步一步指導你在 Java 中建立一個不可變的類。

16)我們能建立一個包含可變對象的不可變對象嗎?

是的,我們是可以建立一個包含可變對象的不可變對象的,你隻需要謹慎一點,不要共享可變對象的引用就可以了,如果需要變化時,就傳回原對象的一個拷貝。最常見的例子就是對象中包含一個日期對象的引用。

資料類型和 Java 基礎面試問題

17)Java 中應該使用什麼資料類型來代表價格?(答案)

如果不是特别關心記憶體和性能的話,使用BigDecimal,否則使用預定義精度的 double 類型。

18)怎麼将 byte 轉換為 String?(答案)

可以使用 String 接收 byte[] 參數的構造器來進行轉換,需要注意的點是要使用的正确的編碼,否則會使用平台預設編碼,這個編碼可能跟原來的編碼相同,也可能不同。

19)Java 中怎樣将 bytes 轉換為 long 類型?

這個問題你來回答 :-)

20)我們能将 int 強制轉換為 byte 類型的變量嗎?如果該值大于 byte 類型的範圍,将會出現什麼現象?

是的,我們可以做強制轉換,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,是以,如果強制轉化是,int 類型的高 24 位将會被丢棄,byte 類型的範圍是從 -128 到 128。

21)存在兩個類,B 繼承 A,C 繼承 B,我們能将 B 轉換為 C 麼?如 C = (C) B;(answer答案)

22)哪個類包含 clone 方法?是 Cloneable 還是 Object?(答案)

java.lang.Cloneable 是一個标示性接口,不包含任何方法,clone 方法在 object 類中定義。并且需要知道 clone() 方法是一個本地方法,這意味着它是由 c 或 c++ 或 其他本地語言實作的。

23)Java 中 ++ 操作符是線程安全的嗎?(答案)

23)不是線程安全的操作。它涉及到多個指令,如讀取變量值,增加,然後存儲回記憶體,這個過程可能會出現多個線程交差。

24)a = a + b 與 a += b 的差別(答案)

+= 隐式的将加操作的結果類型強制轉換為持有結果的類型。如果兩這個整型相加,如 byte、short 或者 int,首先會将它們提升到 int 類型,然後在執行加法操作。如果加法操作的結果比 a 的最大值要大,則 a+b 會出現編譯錯誤,但是 a += b 沒問題,如下:

byte a = 127;

byte b = 127;

b = a + b; // error : cannot convert from int to byte

b += a; // ok

(譯者注:這個地方應該表述的有誤,其實無論 a+b 的值為多少,編譯器都會報錯,因為 a+b 操作會将 a、b 提升為 int 類型,是以将 int 類型指派給 byte 就會編譯出錯)

25)我能在不進行強制轉換的情況下将一個 double 值指派給 long 類型的變量嗎?(答案)

不行,你不能在沒有強制類型轉換的前提下将一個 double 值指派給 long 類型的變量,因為 double 類型的範圍比 long 類型更廣,是以必須要進行強制轉換。

26)3*0.1 == 0.3 将會傳回什麼?true 還是 false?(答案)

false,因為有些浮點數不能完全精确的表示出來。

27)int 和 Integer 哪個會占用更多的記憶體?(答案)

Integer 對象會占用更多的記憶體。Integer 是一個對象,需要存儲對象的中繼資料。但是 int 是一個原始類型的資料,是以占用的空間更少。

28)為什麼 Java 中的 String 是不可變的(Immutable)?(answer答案)

Java 中的 String 不可變是因為 Java 的設計者認為字元串使用非常頻繁,将字元串設定為不可變可以允許多個用戶端之間共享相同的字元串。更詳細的内容參見答案。

29)我們能在 Switch 中使用 String 嗎?(answer答案)

從 Java 7 開始,我們可以在 switch case 中使用字元串,但這僅僅是一個文法糖。内部實作在 switch 中使用字元串的 hash code。

30)Java 中的構造器鍊是什麼?(answer答案)

當你從一個構造器中調用另一個構造器,就是Java 中的構造器鍊。這種情況隻在重載了類的構造器的時候才會出現。

JVM 底層 與 GC(Garbage Collection) 的面試問題

31)64 位 JVM 中,int 的長度是多數?

Java 中,int 類型變量的長度是一個固定值,與平台無關,都是 32 位。意思就是說,在 32 位 和 64 位 的Java 虛拟機中,int 類型的長度是相同的。

32)Serial 與 Parallel GC之間的不同之處?(答案)

Serial 與 Parallel 在GC執行的時候都會引起 stop-the-world。它們之間主要不同 serial 收集器是預設的複制收集器,執行 GC 的時候隻有一個線程,而 parallel 收集器使用多個 GC 線程來執行。

33)32 位和 64 位的 JVM,int 類型變量的長度是多數?(答案)

32 位和 64 位的 JVM 中,int 類型變量的長度是相同的,都是 32 位或者 4 個位元組。

34)Java 中 WeakReference 與 SoftReference的差別?(答案)

雖然 WeakReference 與 SoftReference 都有利于提高 GC 和 記憶體的效率,但是 WeakReference ,一旦失去最後一個強引用,就會被 GC 回收,而軟引用雖然不能阻止被回收,但是可以延遲到 JVM 記憶體不足的時候。

35)WeakHashMap 是怎麼工作的?(答案)

WeakHashMap 的工作與正常的 HashMap 類似,但是使用弱引用作為 key,意思就是當 key 對象沒有任何引用時,key/value 将會被回收。

36)JVM 選項 -XX:+UseCompressedOops 有什麼作用?為什麼要使用?(答案)

當你将你的應用從 32 位的 JVM 遷移到 64 位的 JVM 時,由于對象的指針從 32 位增加到了 64 位,是以堆記憶體會突然增加,差不多要翻倍。這也會對 CPU 緩存(容量比記憶體小很多)的資料産生不利的影響。因為,遷移到 64 位的 JVM 主要動機在于可以指定最大堆大小,通過壓縮 OOP 可以節省一定的記憶體。通過 -XX:+UseCompressedOops 選項,JVM 會使用 32 位的 OOP,而不是 64 位的 OOP。

37)怎樣通過 Java 程式來判斷 JVM 是 32 位 還是 64 位?(答案)

你可以檢查某些系統屬性如 sun.arch.data.model 或 os.arch 來擷取該資訊。

38)32 位 JVM 和 64 位 JVM 的最大堆記憶體分别是多數?(答案)

理論上說上 32 位的 JVM 堆記憶體可以到達 2^32,即 4GB,但實際上會比這個小很多。不同作業系統之間不同,如 Windows 系統大約 1.5 GB,Solaris 大約 3GB。64 位 JVM允許指定最大的堆記憶體,理論上可以達到 2^64,這是一個非常大的數字,實際上你可以指定堆記憶體大小到 100GB。甚至有的 JVM,如 Azul,堆記憶體到 1000G 都是可能的。

39)JRE、JDK、JVM 及 JIT 之間有什麼不同?(答案)

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 應用的性能。

Andrid面試題彙總