java虛擬機內存
阿新 • • 發佈:2019-01-12
lin tps code 靜態方法 text 線程 out () 管理
1 –verbose:gc
在虛擬機發生內存回收時在輸出設備顯示信息
1、程序計數器
程序計數器是一塊比較小的內存空間,可以看做是當前線程所執行的字節碼的行號指示器。
多線程時,為了線程切換後能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲。
2、棧
線程私有,聲明周期和線程相同。
存放基本數據類型和對象的引用。
3、堆Heap
java堆是java虛擬機內存最大的一塊。
java堆是被所有線程所共享的一塊區域,在虛擬機創建時啟動,存放對象實例。
java堆是垃圾回收器管理的主要區域,因此又被稱為“GC堆”(Garbage Collection Heap)。
java堆還可以細分為新生代和老年代。
4、方法區
方法區,和java堆一樣,是線程共享的一塊區域,用於存儲已經被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯的代碼。
二、畫內存圖
分析下面的代碼
1 public static void main(String[] args) { 2 AVGirl girl1 = new AVGirl(); 3 girl1.name = "蒼老師"; 4 AVGirl.country = "日本"; 5 girl1.sayHi(); 6 7 8 AVGirl girl2 = newAVGirl(); 9 girl2.name = "波多老師"; 10 AVGirl.country = "日本213"; 11 girl2.sayHi(); 12 13 } 14 class AVGirl{ 15 String name; // 姓名 16 static String country; // 國籍 17 18 public void sayHi() { 19 System.out.println(name + "..." + country); 20 } 21 22 }
1、加載.class文件(字節碼文件)到方法區
2、main方法入棧
3、創建AVGril的對象,先要加載AVGril.class
AVGril.class中 分為 靜態區和非靜態區
這時初始化靜態變量conutry初值為null;
4、創建對象(堆區開辟空間)
5、把對象的地址賦給girl1變量保存
6、通過類名 修改 類變量的值
7、sayHi方法入棧 打印
8、sayHi方法出棧
9、main出棧
靜態方法和非靜態方法的區別?
非靜態方法:
1.可以使用靜態變量 和 非靜態變量
2.可以使用靜態方法 和 非靜態方法
靜態方法:
1.只能使用靜態變量
2.只能使用靜態方法
java虛擬機內存