1. 程式人生 > >java虛擬機內存

java虛擬機內存

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 = new
AVGirl(); 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虛擬機內存