1. 程式人生 > >java基礎知識學習

java基礎知識學習

希望 java語言 code java基礎知識 如何 必須 原則 sun 成員變量

Java 內存分配策略

  • 靜態存儲區(方法區):主要存放靜態數據、全局 static 數據和常量。這塊內存在程序編譯時就已經分配好,並且在程序整個運行期間都存在。

  • 棧區 :當方法被執行時,方法體內的局部變量(其中包括基礎數據類型、對象的引用)都在棧上創建,並在方法執行結束時這些局部變量所持有的內存將會自動被釋放。因為棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限

  • 堆區 : 又稱動態內存分配,通常就是指在程序運行時直接 new 出來的內存,也就是對象的實例。這部分內存在不使用時將會由 Java 垃圾回收器來負責回收。

結論

  • 局部變量的基本數據類型和引用存儲於棧中,引用的對象實體存儲於堆中。—— 因為它們屬於方法中的變量,生命周期隨方法而結束。
  • 成員變量全部存儲在堆中(包括基本數據類型,引用和引用的對象實體)—— 因為它們屬於類,類對象終究是要被new出來使用的。

Java是如何管理內存

  GC 為了能夠正確釋放對象,GC 必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC 都需要進行監控。監視對象狀態是為了更加準確地、及時地釋放對象,而釋放對象的根本原則就是該對象不再被引用。

  如圖,我們舉一個例子說明如何用有向圖表示內存管理。對於程序的每一個時刻,我們都有一個有向圖表示JVM的內存分配情況

  技術分享圖片

  Java使用有向圖的方式進行內存管理,可以消除引用循環的問題,例如有三個對象,相互引用,只要它們和根進程不可達的,那麽GC也是可以回收它們的。這種方式的優點是管理內存的精度很高,但是效率較低。另外一種常用的內存管理技術是使用計數器,例如COM模型采用計數器方式管理構件,它與有向圖相比,精度行低(很難處理循環引用的問題),但執行效率很高。

什麽是Java中的內存泄露

  兩個特點,首先,這些對象是可達的,即在有向圖中,存在通路可以與其相連;其次,這些對象是無用的,即程序以後不會再使用這些對象。如果對象滿足這兩個條件,這些對象就可以判定為Java中的內存泄漏。

  GC的函數System.gc(),但是根據Java語言規範定義, 該函數不保證JVM的垃圾收集器一定會執行。

  通常,GC的線程的優先級別較低。JVM調用GC的策略也有很多種,有的是內存使用到達一定程度時,GC才開始工作,也有定時執行的,有的是平緩執行GC,有的是中斷式執行GC。如網絡遊戲等,用戶不希望GC突然中斷應用程序執行而進行垃圾回收,那麽我們需要調整GC的參數,讓GC能夠通過平緩的方式釋放內存,例如將垃圾回收分解為一系列的小步驟執行,Sun提供的HotSpot JVM就支持這一特性。

同樣給出一個 Java 內存泄漏的典型例子,

Vector v = new Vector(10);   
for (int i = 1; i < 100; i++) {   
    Object o = new Object();   
    v.add(o);   
    o = null;      
}

java基礎知識學習