天天看點

(一)java虛拟機——初步認識

java虛拟機的基本結構

(一)java虛拟機——初步認識

java虛拟機的參數設定

java [虛拟機參數] class [main()函數參數]

執行個體:

public class SimpleArgs {
  public static void main(String[] args) {
    for(int i=0;i<args.length;i++) {
      System.out.println("args"+(i+1)+":"+args[i]);
    }
    System.out.println("-Xmx"+Runtime.getRuntime().maxMemory()/1000/1000+"M");
  }
}
           
(一)java虛拟機——初步認識

認識java堆

根據垃圾回收機制的不同,java堆可能有不同的結構,最常見的結構如下:

(一)java虛拟機——初步認識

認識java棧

java虛拟機最大棧空間可以用參數

-Xss

指定,如果局部變量表的函數參數和局部變量增多,函數的嵌套層次将變少,幀棧和函數調用如下圖所示:

(一)java虛拟機——初步認識

棧上配置設定與逃逸分析

非逃逸對象有可能配置設定到棧上,好處是在函數調用結束後自行銷毀,不需要垃圾回收器的介入,是以棧上配置設定速度快,(但是棧空間比較小,大對象不合适在棧上配置設定)。

// 對象User u 是類的成員,該字段可能被任何線程通路,是以屬于逃逸對象

private static User u;
public static void alloc() {
  u = new User();
  u.id = 5;
  u.name = "haward";
}
           

// 下面的為非逃逸對象

public static void alloc() {
    User u = new User();
    u.id = 5;
    u.name = "haward"; 
}
           

認識局部變量表

利用

jclasslib

工具分析函數的局部變量資訊(打開class位元組碼)

(一)java虛拟機——初步認識
(一)java虛拟機——初步認識
(一)java虛拟機——初步認識
(一)java虛拟機——初步認識

源碼為

public class Main {
  public static void main(String[] args) {
    TestClass testClass = new TestClass();
    testClass.localvar1();
    testClass.localvar2();
  }
}

class TestClass {
  // 局部變量a和b都作用到函數末尾,b無法複用a所在的槽位
  public void localvar1() {
    int a = 0;
    System.out.println(a);
    int b = 0;
  }
  // 局部變量a在19行時候不在有效,b複用a所在的槽位
  public void localvar2() {
    {
      int a = 0;
      System.out.println(a);
    }
    int b = 0;
  }
}
           

認識方法區

方法區是一塊所有線程共享的記憶體區域,用于儲存系統類的資訊,比如類的字段、方法、常量池等。方法區的大小決定了系統可以儲存多少個類,可以使用參數

-XX:MaxPermSize

-XX:PermSize

指定大小

參考:

《實戰java虛拟機》

jvm