1. 程式人生 > 其它 >面向物件--引用型別資料及物件記憶體管理

面向物件--引用型別資料及物件記憶體管理

三、陣列

1、引用型別陣列:

1.1 陣列是物件

  • 陣列是引用資料型別;
  • 陣列物件在堆中建立,宣告的變數是引用型別,引用儲存的是陣列物件的地址值,指向陣列物件;
  • 可以將陣列中的元素看成物件的成員變數,只不過型別完全一致而已。

 

 

 1.2 引用型別陣列的宣告

  • 陣列的元素可以為任意型別,當然也可以為引用型別;
  • 引用型別陣列元素儲存的不是物件本身,而是儲存元素物件的引用。
public class Cell { 
    int row; 
    int col; 
    public Cell(int col,int row) { 
        this.col = col; 
        
this.row = row; } } public class TestCell { public static void main(String[] args) { Cell[] cells = new Cell[3];// cells[0] = new Cell(1,2); cells[1] = new Cell(1,2); cells[2] = new Cell(1,2); System.out.println(Arrays.toString(cells)); } }

1.3 陣列的初始化(重點)

  • 陣列元素的預設值為null;
  • 如果希望每個元素都指向具體的物件,則需要對每個元素都使用new建立例項。

 

 

 1.4 陣列的元素是基本型別陣列

  • 陣列的元素可以為任意型別,當然也可以為基本型別陣列--二維陣列
public class Cell { 
    int row; 
    int col; 
    public Cell(int col,int row) { 
        this.col = col; 
        this.row = row; 
    } 
}
public class TestCell { 
    public static void
main(String[] args) { Cell[] cells = new Cell[3];// cells[0] = new Cell(1,2); cells[1] = new Cell(1,2); cells[2] = new Cell(1,2); System.out.println(Arrays.toString(cells)); } }

四、物件記憶體管理(重點)

1、堆記憶體

1.1 物件儲存在堆中

  • JVM分為三個區域:堆(heap)、棧(stack)、方法區(method);
  • JVM為java程式提供並管理所需要的記憶體空間;
  • 堆中儲存使用new關鍵字建立的物件---陣列、String、Person等。

 

 

 1.2 成員變數的生命週期

  • 當一個引用值為null時,該物件沒有任何引用指向,則該物件被設為廢棄物件,屬於被回收範圍;
  • 成員變數的生命週期:從物件在堆中建立,到物件從堆中被回收為止;

1.3 垃圾回收機制

  • 垃圾回收器(Garbage Collection ,GC),是JVM自帶的一個執行緒(自動執行的),用於回收沒有任何引用指向的物件;
  • 垃圾回收器會自動幫java程式設計師處理垃圾。

1.4 記憶體洩漏

  • 記憶體洩漏:不再使用的物件沒有被及時回收,積攢過多導致程式崩潰。

1.5 System.gc()方法

  • GC執行緒不會剛發現無用物件就會回收,如果需要強制回收,則使用System.gc()方法;

  • 這個方法強制排程GC執行緒回收無用物件。

2、棧

2.1 棧存放方法中的區域性變數

 

 2.2 區域性變數的生命週期

  • 宣告週期:棧幀被建立開始--方法執行完畢棧幀被銷燬結束,區域性變數也隨之銷燬;
  • 棧幀中儲存的是:區域性變數和引數等。

 

 2.3 區域性變數和成員變數的區別:

成員變數:

  • 定義在類外,方法外;
  • 有預設初始值,可以不顯式初始化;
  • 所在類被例項化之後,存在堆中,物件被回收時,成員變數失效;

區域性變數:

  • 定義在方法外;
  • 沒有預設值,必須自行設定初始值;
  • 方法被呼叫時,存在棧中,方法呼叫結束,從棧中清除。

3、方法區

3.1 存放類的資訊

  • java在執行時,會通過類載入器載入類檔案的位元組碼資訊,解析後放在方法區中。

3.2 方法只有一份

  • 當類的資訊載入到方法區時,類中的類方法也被載入在方法區中;
  • 無論建立多少物件,所有的物件是公用方法區中一個方法的定義。