java內存管理機制
因為我也不清楚你理解的內存指啥,說我的理解,猜測一下,但願符合你的理解:
對程序而言,內存分為:
a、靜態區塊或叫全局區塊,指程序載入的時候就分配的固定存儲區;
b、棧內存,代碼塊執行的時候動態分配的內存塊,代碼運行完後,操作系統或運行平台負責自動回收這部分使用的內存。
c、堆內存塊,由操作系統提供api程序自由分配管理的內存塊。
java的內存管理機制,我個人認為是黑盒的,寫java也很少有人去關心,但是如果看虛擬機的實現源碼還是能知道的。(樓主懂c由興趣自己看)。那麼從逆向工程的角度我們可以猜測到:
靜態類,靜態變數,存儲在,靜態區塊中。
類本身代碼需要時再載入到內存中,java的動態代理實現的根本。既然是動態載入肯定是在堆中,不過載入進來的類代碼可能永不會銷毀(虛擬機運行區間內,可以加快運行平台的處理速度,java屬於半編譯半解釋的一門語言,要解釋執行的是預先編譯好的指令,就是class類文件)。
我們創建的任何對象,時間是隨機的,創建的時候才會分配內存,必然在堆上。虛擬機的垃圾回收機制要管理的剛好是這部分內存。
類中的方法,或靜態代碼塊必定運行在占上,代碼運行完,內存立即回收。此處有個例外,不同於c語言或操作系統實現。在方法中返回的任何對象:c需要動態分配存儲空間,兵自行管理,或者申明為全局局部靜態存儲,代碼運行完,對象才能保留下來。java可以直接保留下來。說明虛擬機自動給我們申請了動態內存保存對象。此處分配的內存也需要垃圾回收機制管理。沒門語言都有原始類型,方法或函數中返回的原始類型不需要從堆上分配內存,直接復制給接收變數,或代碼運行的形參所分配的空間中即可。
從操作系統理解,內存分為內核使用的內存與程序使用的內存,java運行在虛擬機上,虛擬機運行在操作系統上,內核內存屬於操作系統自用內存,由操作系統負責管理,運用程序不能直接管理分配內核內存。應用程序可管理的是分配給自己的運行空間。因此java使用內存屬於應用程序內存。內核內存管理方式windows與unix實現管理方式不一樣,最大差別windows的每一個程序,內核需要使用掉一部分地址空間,餘下的留給應用程序。如32位系統,總共可以使用的地址空間是4G內核要用掉其中1G或者2G。但是unix實現的系統應用程序可以直接使用4G地址空間。有興趣請參考操作系統內核相關書籍。