程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java程序內存的簡單分析,java程序分析

Java程序內存的簡單分析,java程序分析

編輯:JAVA綜合教程

Java程序內存的簡單分析,java程序分析


這篇文章將簡單的說明下當我們運行Java程序時JVM(Java虛擬機)的內存分配情況。

首先我們先來感觀的認識下幾個名詞:

1、棧,一般來說,基本數據類型直接在棧中分配空間,局部變量(在方法代碼段中定義的變量)也在棧中直接分配空間,當局部變量所在方法執行完成之後該空間便立刻被JVM回收,還有一種是引用數據類型,即我們通常所說的需要用關鍵字new創建出來的對象所對應的引用也是在棧空間中,此時,JVM在棧空間中給對象引用分配了一個地址空間(相當於一個門牌號,通過這個門牌號就可以找到你家),在堆空間中給該引用的對象分配一個空間,棧空間中的地址引用指向了堆空間中的對象區(通過門牌號找住址);

2、堆,一般用來存放用關鍵字new出來的數據。

接下來我們再通過一段程序來直觀感受下程序運行時JVM的內存情況,

 1 package demo;
 2 
 3 public class Student {
 4     private String name;
 5     private int age;
 6 
 7     public void study() {
 8         System.out.println("I love study!");
 9     }
10 
11     public String getName() {
12         return name;
13     }
14 
15     public void setName(String name) {
16         this.name = name;
17     }
18 
19     public int getAge() {
20         return age;
21     }
22 
23     public void setAge(int age) {
24         this.age = age;
25     }
26 }
 1 package demo;
 2 
 3 public class StudentDemo {
 4     public static void main(String[] args) {
 5         Student student = new Student();
 6 
 7         System.out.println(student.getName() + ":" + student.getAge());
 8         student.setName("John");
 9         student.setAge(23);
10         System.out.println(student.getName() + ":" + student.getAge());
11         
12         student.study();
13         
14         Student student2 = student;
15         student2.setName("Jack");
16         student2.setAge(25);
17         System.out.println(student2.getName() + ":" + student2.getAge());
18         System.out.println(student.getName() + ":" + student.getAge());
19     }
20 }

當我們運行程序時,JVM會把Student類與StudentDemo類編譯完然後加載到JVM中一個叫方法區的地方,類的成員變量與成員方法也被加載到方法區中,此時內存模型如下

可以看到study方法右邊各有一個16進制的標記,而name與age變量沒有,這是因為每個對象都有各自的成員變量,而類中的成員方法卻可以被每個對象所共用,為了節省內存空間,JVM為方法分配了該標記(也叫內存地址)便於每個new出來的對象查找調用,接著JVM會自動尋找main方法,在棧中為main方法申請一個空間,這個過程也叫入棧,然後執行我們Student類中第5行代碼,這時候,JVM在堆空間中分配一塊內存給Student對象,並為其分配一個內存地址(如果對象的成員變量沒有賦值,則JVM會為變量賦初始值),在棧中分配一塊內存空間用於指向堆空間中的Student對象區的內存地址,此時內存模型如下

接著看代碼第8行與第9行,程序為student對象的成員變量賦值,JVM會根據student所指向的地址在堆內存中尋找Student類的變量,並為變量賦新的值

第12行,這時student對象調用study方法,JVM在棧空間中為study方法申請了一塊內存空間

study方法執行完後,立即釋放棧空間,代碼第14行,student2對象的引用指向了student所指向的地址

代碼15與16行,為student2的變量賦值,由於student2與student指向了同一個地方,所以這時student對象中變量的值也被改變

到這,main方法中所有代碼執行完畢,main方法所占用的棧空間也被回收,而堆空間等待GC回收

代碼執行結果如下:

null:0
John:23
I love study!
Jack:25
Jack:25

寫的較為簡單,僅作為知識記錄,歡迎指正!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved