程序裝載及執行說明
程序執行流程:
java 程序代碼執行流程:
java源文件----->java編譯器------>java字節碼(class文件)----->類裝載器------>
java解釋器/編譯器加載到運行時係統(java虛擬機)----->操作係統---->硬件
怎樣把程序裝載到操作係統中?
係統給每個程序把內存分成四個分區:
第一個是.data區:存放的是程序的數據,靜態的常量。
第二個是.code區:程序的執行代碼,編譯成可執行的內存代碼(0011二進製數據),
加載到係統內存中。
第三個是:棧空間:在程序運行的時候使用的空間,最好不要超過6M(windows下一般是6M) 。
是連續的空間,所以訪問速度和效率會比堆空間要高。
第四個是:堆空間:是不連續的空間,會有一些碎片。
說明:程序執行在code區,找到程序的主入口(Main函數)。從上往下執行代碼,為函數中的變量
在棧空間中開辟內存空間,存儲變量值。在code區中調用其它子函數。而當子函數執行完畢後,
為子函數變量分配的棧空間,要進行出棧操作,而這塊內存空間就被清空掉,就不可再被使用的
(棧的回收,是操作係統的特性去實現的)。
在c語言程序中,可以通過malloc動態的申請一塊內存空間,這塊內存空間就是在堆內存中的。
而java中new Oject是在堆內存中存放這個對象的,而java虛擬機的垃圾回收機製就是去掃描堆內存
中的數據,若發現堆內存中的數據,在棧內存中沒有引用的, 就會把這個對象回收。
例:person p = new person();可以分為下幾步:
一,是定義了一個person的變量p(在棧內存中)。二,在堆內存中new出一個person對象。
三,把person對象的引用傳給p。
而若定義person q; q = p;則是在棧空開辟了一塊q的空間,然後再把p中的地址附給了q,
這樣p和q就是指向相同的地址值,指的就是同一個對象,它們都可以 修改這個對象中的值,
而隻有當p和q都null時, java虛擬機才會釋放person對象。而p和q在棧內存中也有一定的
作用範圍的,當p和q所在的方法執行完畢時,p和q的作用空間就失效了,就會執行出棧操作。
c語言比java執行效率高,是因為c語言可以由用戶自己申請內存空間,用戶自己釋放內存空間。
而java是程序員自己把對象都至成Null,然後等待垃圾回收器去回收遊離的對象,程序員無法
控製對象何時被回收。
c、c++語言程序泄露的原因?
就是程序員在堆內存中申請了過多的空間,用完之後又沒有釋放,就會導致內存泄露。
內存泄露特點:就是會隨著程序運行的時間,占用的內存會起來越多。最後程序所申請的堆內存,
會超過操作係統所提供的內存。
因為堆內存是不連續的,所以就能申請到係統中所有的剩餘內存。
說明:不管是java、linux、windows程序都是需要加載到內存中,才能被執行的。
最後更新:2017-04-02 17:28:39