在任何編程語言中,無論是基本類型還是引用類型,不論其作用域如何,都必須為其分配一定的內存空間,Java 語言也不例外,Java 的數據類型可以分為兩種:基本類型(變量持有數據本身的值)和引用類型(是某個對象的引用,而並非是對象本身);基本類型包括:boolean、float、double、int、long、short、byte以及char;在Java編程語言中除基本類型以外其余都是引用類型如:類類型、數組類型等。
在計算機內存中主要來自四個地方:heap segment(堆區)、stack segment(棧區)、codesegment(代碼區)、data segment(數據區);不同的地方存放不同數據:其中堆區主要存放Java程序運行時創建的所有引用類型都放在其中;棧區主要存放Java程序運行時所需的局部變量、方法的參數、對象的引用以及中間運算結果等數據;代碼區主要存放Java的代碼;數據區主要存放靜態變量及全局變量;以下結合實例來探討其具體機制。
class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } } public class Test { static int i = 10; public static void main(String[] args) { Student s1 = new Student(“feng”, 21); } } |
當該程序運行起來后,其計算機內存分布大致如下:
對象在內部表示Java虛擬機規范並沒有規定其在堆中是如何表示的。對象的內部的表示會直接影響到堆區的設計以及垃圾收集器(GC)的設計。
Java在堆中的表示方法具體有兩種:
把堆分成兩個部分:一個句柄池,一個對象池;表示如下圖所示:
用對象指針直接指向一組數據,而該數據包括對象實例數據以及指向方法區中的數據的指針,具體如下圖所示:
小結:通過對對象內存分配的分析,來使讀者對Java的底層有一個比較理性的認識,從而進一步掌握Java的基礎知識。在深入了解了Java內存的分配以后,才能為以后編寫高質量的程序打下堅實的基礎,而且可以借鑒該思想來分析其它面向對象語言的內存分配問題。