閱讀394 返回首頁    go 阿裏雲 go 技術社區[雲棲]


程序裝載及執行說明

 

 

程序執行流程:

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

  上一篇:go Android XML文件使用
  下一篇:go 在iOS上實現瀑布流界麵