JVM內存回收策略介紹

     java語言不像C/C++一樣可以通過malloc這種語法直接操作內存,java語言沒有提供直接操作內存的語法,但程序都需要內存空間來支持,java語言通常有兩種內存申請方法:一種是靜態內存分配,另一種是動態內存分配。

1、靜態內存分配和回收

     java靜態內存分配是指java被編譯時,就已經能夠確定需要的內存空間,當程序被加載時,系統會一次性分配內存給它,這些內存不會在程序執行是發生變化,直到程序結束內存纔會被回收。例如一些數據類型和對象的引用。這些靜態內存空間是在java棧上分配的,當這個方法運行結束時,對應的棧也就撤銷,所以分配的靜態內存空間也就回收了。

2、動態內存分配和回收

     原生數據類型存儲在java棧中,方法執行結束就會消失,關於對象類型,他存儲在java堆中,它可以被共享,不一定隨着方法執行結束而消失。所謂動態類型分配就是在程序執行時才知道要分配的存儲空間的大小,而不是在編譯時就能確定的。這個對象什麼時候被回收也是不確定的,只有等到這個對象不再使用時纔會被回收。Java程序員不需要關注內存的分配和回收,只需要關注這些數據類型的使用就行了。

3、關於java中內存分配:

  • 棧內存分配
  • 堆內存分配
從堆和棧的功能和作用來比較,堆主要用來存放對象,棧主要用來執行程序,這主要是由堆和棧的特點來決定的。棧中主要存放一些基本類型的變量數據(int short long byte float double boolean char)和對象句柄(即引用),存取速度快。堆的優勢可以動態的分配內存的大小,生存週期不必告訴編譯器,保存數據時具有靈活性,但再分配和銷燬時要佔用一定時間。

4、如何進行垃圾回收(GC)呢?

     JVM在做垃圾回收時會檢查堆中的所有對象是否都會被這些根對象直接或間接引用,能夠被引用的對象就是活動對象,否則就可以被垃圾收集器回收。所謂根對象是堆中持久用的對象,它若引用或者間接引用其他對象時,引用的對象不能被垃圾器回收,若此對象沒有直接引用和間接引用,則就要被垃圾收集器回收。


本文不再討論內存垃圾收集算法。

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