網上關于該題目的文章已經很多,我覺得把它們幾個關聯起來講可能更好理解一下。與其它語言一樣,它在執行我們寫的程序前要先分配內存空間,以便于存放代碼、數據;程序的執行過程其實依然是代碼的執行及數據的讀寫過程;除了在執行我們寫的顯式的可見代碼外,Jvm還會自動幫我們幫一些事,包括類的加載、初始化、GC等,這些也不特殊。以下分別來說下這些概念。
這一點基本上同其它高級語言一樣,Java包含:堆、棧、本地棧(有些特殊)、永久代碼區。以下具體說下每個內存區的作用及使用方式 概念 修改方式 永久代碼區 其實代碼兩個字是我加上去的,它并不是單單存放代碼,但代碼的確是最主要、最典型的、對于一個類A,不論實例化多少對象,它的代碼區有始自終都只有一塊。這個區包含的主要是類的信息、比如static字段,final常量(跟編譯器還是有些關系),各種方法(包括static及無static修飾的)二進制天書等,這一區域往往在整個JVM執行過程中大小不變。 XX:PermSpace 本地棧 用于java native線程,也就是用jni里添加的線程使用的棧,因為本人沒寫過多少jni代碼,這塊不詳說。 ? 棧 說到棧必須關聯線程,線程包含我們平時常用的主線程main、及我們調用Thread.start()運行起來的一般線程,一個線程一個棧;棧的作用大家應該清楚,就是用來保留我們線程執行的現場,包括:調用者函數的局部變量、參數等;棧的特色是存放的東西都很小,存取速度很快。 Xss 堆 堆,應該是內存是占用最大的一個部分,跟據jvm的配置不同,堆可占到jvm總使用內存的95%以上,當然這個數字沒多大意義,只是給大家一個感覺,相對于其它語言,Java里的堆比較好理解,所有我們new出來的對象都存放在堆里,而它的使用者通過"引用"來調用它,引進會經常被壓入之前我們提到的棧里(引用很小,所以很適合在棧里進進出出)。 Xms 初始大小 及 Xmn 年輕代大小?
permanent space
及
XX:MaxPermSpace
native stack
stack
及
-XX:MainThreadStackSize
heap
及
Xmx 最大值
?
*注意:32位的機器內存設置的總合一般不能大于1.5G(即使你有4G的物理內存,可能跟java的尋址方式有關;是否有其它解決方案,還望高人給出)
我這里舉個例子
public class Demo { // 永久代碼區 <- 類總體信息
public static String staticField; // 永久代碼區
public String dynField; // 堆
public static void staticMtd() { // 永久代碼區 <- 代碼塊
int i = 0; //直接量引用(程序員不可見)往往在寄存器里,或是其它臨時的地方
String str = ""; //str的實例在堆里
System.out. }
public void mtd() { // 永久代碼區 <- 代碼塊(但加了訪問限制,只有用對象才能引用到該代碼塊)
}
}
完成了這部分,剩下的兩部分就想對簡單了:
類在第一次使用之前被加載初始化,具體怎么加載取決于運行環境。類的初始化即在永久代碼區里為類及字段分配內存空間,然后再跟據我們的書寫順序依次賦值或執行static塊。
比如:
static{ System.out.println("first exc"); }
static String Field = "x";
static String F2 = Field;
static{System.out.println("after F2=Field");}
//賦值及執行順序就是書寫順序。
構造子類之前必須調用父類,且構造塊會構造函數之前執行(很想知道具體是怎么實現的,望大師指點)
舉個例子:
A類:
public class A {
static {
System.out.println("A static block");
}
public A() {
super();
System.out.println("A constructor");
}
{
System.out.println("A not static block" + this);
}
}
B類:
public class B extends A {
static {
System.out.println("B static block");
}
public B() {
super();
System.out.println("B constructor");
}
{
System.out.println("B not static block");
}
public static void main(String[] args) {
new B();
}
}
結果:
A static block
B static block
A not static blockB@a90653
A constructor
B not static block
B constructor
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
新聞熱點
疑難解答