1. 程式人生 > >2017-Java面試必看問題之二

2017-Java面試必看問題之二

16、GC是什麼?為什麼要有GC?
  答:GC是垃圾收集的意思,記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,Java語言沒有提供釋放已分配記憶體的顯示操作方法。Java程式設計師不用擔心記憶體管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以呼叫下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以遮蔽掉顯示的垃圾回收呼叫。 
  垃圾回收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體。垃圾回收器通常是作為一個單獨的低優先順序的執行緒執行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的物件進行清除和回收,程式設計師不能實時的呼叫垃圾回收器對某個物件或所有物件進行垃圾回收。在Java誕生初期,垃圾回收是Java最大的亮點之一,因為伺服器端的程式設計需要有效的防止記憶體洩露問題,然而時過境遷,如今Java的垃圾回收機制已經成為被詬病的東西。移動智慧終端使用者通常覺得iOS的系統比Android系統有更好的使用者體驗,其中一個深層次的原因就在於Android系統中垃圾回收的不可預知性。 

  補充:垃圾回收機制有很多種,包括:分代複製垃圾回收、標記垃圾回收、增量垃圾回收等方式。標準的Java程序既有棧又有堆。棧儲存了原始型區域性變數,堆儲存了要建立的物件。Java平臺對堆記憶體回收和再利用的基本演算法被稱為標記和清除,但是Java對其進行了改進,採用“分代式垃圾收集”。這種方法會跟Java物件的生命週期將堆記憶體劃分為不同的區域,在垃圾收集過程中,可能會將物件移動到不同區域: 
  - 伊甸園(Eden):這是物件最初誕生的區域,並且對大多數物件來說,這裡是它們唯一存在過的區域。 
  - 倖存者樂園(Survivor):從伊甸園倖存下來的物件會被挪到這裡。 
  - 終身頤養園(Tenured):這是足夠老的倖存物件的歸宿。年輕代收集(Minor-GC)過程是不會觸及這個地方的。當年輕代收集不能把物件放進終身頤養園時,就會觸發一次完全收集(Major-GC),這裡可能還會牽扯到壓縮,以便為大物件騰出足夠的空間。 

  與垃圾回收相關的JVM引數: 
  -Xms / -Xmx — 堆的初始大小 / 堆的最大大小 
  -Xmn — 堆中年輕代的大小 
  -XX:-DisableExplicitGC — 讓System.gc()不產生任何作用 
  -XX:+PrintGCDetails — 列印GC的細節 
  -XX:+PrintGCDateStamps — 列印GC操作的時間戳 
  -XX:NewSize / XX:MaxNewSize — 設定新生代大小/新生代最大大小 
  -XX:NewRatio — 可以設定老生代和新生代的比例 
  -XX:PrintTenuringDistribution — 設定每次新生代GC後輸出倖存者樂園中物件年齡的分佈 

  -XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:設定老年代閥值的初始值和最大值 
  -XX:TargetSurvivorRatio:設定倖存區的目標使用率 
17、日期和時間:
- 如何取得年月日、小時分鐘秒?
- 如何取得從1970年1月1日0時0分0秒到現在的毫秒數?
- 如何取得某月的最後一天?
- 如何格式化日期?
  答: 
  問題1:建立java.util.Calendar 例項,呼叫其get()方法傳入不同的引數即可獲得引數所對應的值。Java 8中可以使用java.time.LocalDateTimel來獲取,程式碼如下所示。