Java程序運行機制及運行過程



Java運行機制

 

Java虛擬機(Java Virtual Machine):Java虛擬機可以理解成一個以字節碼爲機器指令的CPU;對於不同的運行平臺,有不同的虛擬機;Java虛擬機機制屏蔽了底層運行平臺的差別,真正實現了“一次編譯,隨處運行”。

 

Java垃圾回收(Garbage Collection):不用使用的內存空間應該回收;在C/C++等語言中,由程序員負責回收無用的內存;Java語言消除了程序員回收無用內存的職 責,它提供一種系統級線程跟蹤存貯空間的分配情況,並在JVM空閒的時候,檢查並釋放那些可以被釋放的內存空間;垃圾收集在java程序運行過程中自動進 行,程序員無法控制和干預。

 

Java運行過程

 

Java源文件(*.java)——>Java編譯器——>字節碼文件(*.class)——>類裝載器——>字節碼校檢器—— >解釋器——>操作系統(Windows、Linux等)整個文件Load到內存區,一系列動作之後形成操作系統認識的代碼,操作系統找到 main方法開始實行。

heap——>new 出來的東西放在這裏

stack——>局部變量

data segment——>靜態變量或字符串常量

code segment——>存放代碼

 

局部變量:方法或是語句塊內部定義的變量(local variable)

成員變量:方法外部、類內部定義的變量,也叫做全局變量(glbal valiable)

 

Java Application初步

 

一個源文件中最多只能有一個public類,其他類的個數不限。程序的入口是:

public static void main(String[] args){...}

Java 語言嚴格區分大小寫和格式。


ava中程序執行過程及內存分配情況:
Java中程序執行過程及內存分配情況 

下面用一個程序例子來說明內存的分配,程序如下:

Java中程序執行過程及內存分配情況

注意:下面圖中的堆和棧應該互換一下,本人在畫圖時搞反了!

1.首先用new定義了一個對象test,(於用new來定義對象或變量)其內存分配情況如下:

Java中程序執行過程及內存分配情況

2.然後定義了一個整形變量date,其值爲9.內存分配情況如下:

Java中程序執行過程及內存分配情況

3.接着用new定義了兩個對象,d1和d2.其內存分配情況如下:

Java中程序執行過程及內存分配情況

4.接着用test來調用其方法change1,調用了方法,進行了值傳遞。在調用時將9賦予變量i,後面在函體內只是改變了變量i的值,而沒有改變date的值。內存分配情況如下:

Java中程序執行過程及內存分配情況

5. 由於變量i是在調用函數change時分配的,在函數調用結束就回收了變量i的內存分配。調用完後內存分配情況如下:

Java中程序執行過程及內存分配情況

6.調用test的change2函數,將d2作爲參數傳遞給形參。在調用函數時在內存堆中分配一個對象b的空間,然後在內存棧中通過值傳遞分配實際單元與值。在調用change2時,執行函數體內的語句,只是改變了對象b中的內容,而d1中的內容未改變。內存分配情況如下:

Java中程序執行過程及內存分配情況

7.在調用完函數後,回收b的內存空間(包括堆與棧中的內容)。內存分配情況如下:

Java中程序執行過程及內存分配情況

8.調用test的方法change3方法,在內存的堆中分配一塊區域給形參對象b,在棧中的分配指向d1的區域,器內存分配情況如下:

Java中程序執行過程及內存分配情況

9.然後執行函數中的語句,將對象d1中的值改變爲22,調用函數結束後,回收堆棧中的內存空間。其內存分配情況如下:

Java中程序執行過程及內存分配情況

注意:上面圖中的堆和棧應該互換一下,本人在畫圖時搞反了!

綜上所述,內存分配情況是:

1.new分配的變量在對區域中,局部變量在棧區域中。

2.要想改變值時,只有當通過引用調用其方法纔有作用發生。

程序在執行時,內存的情況是非常重要的,只有弄懂內存分配情況,才能跟好解決問題。



文章來源:http://www.360doc.com/content/12/0630/08/6828497_221295060.shtml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章