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虛拟機最大棧空間可以用參數
-Xss
指定,如果局部變量表的函數參數和局部變量增多,函數的嵌套層次将變少,幀棧和函數調用如下圖所示:
棧上配置設定與逃逸分析
非逃逸對象有可能配置設定到棧上,好處是在函數調用結束後自行銷毀,不需要垃圾回收器的介入,是以棧上配置設定速度快,(但是棧空間比較小,大對象不合适在棧上配置設定)。
// 對象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位元組碼)
源碼為
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虛拟機》