導航:首頁 > 物理學科 > 堆空間占物理空間的多少錢

堆空間占物理空間的多少錢

發布時間:2022-09-13 01:30:09

1. 河北北大青鳥:增加java堆空間方法

在大多數32位機、Sun的JVM上,Java的堆空間默認的大小為128MB,但也有例外,例如在32未Solaris操作系統(SPARC平台版本)上,默認的最大堆空間和起始堆空間大小為-Xms=3670K和-Xmx=64M。
對於64位操作系統,一般堆空間大小增加約30%。
但你使用Java1.5的throughput垃圾回收器,默認最大的堆大小為物理內存的四分之一,而起始堆大小為物理內存的十六分之一。
要想知道默認的堆大小的方法,可以用默認的設置參數打開一個程序,使用JConsole(JDK1.5之後都支持)來查看,在VMSummary頁面可以看到最大的堆大小。
用這種方法你可以根據你的程序的需要來改變堆內存大小,我強烈建議採用這種方法而不是默認值。
如果你的程序很大,有很多對象需要被創建的話,你可以用-Xmsand-Xmx這兩個參數來改變堆內存的大小。
Xms表示起始的堆內存大小,Xmx表示最大的堆內存的大小。
另外有一個參數-Xmn,它表示newgeneration(後面會提到)的大小。
河北電腦培訓http://www.kmbdqn.cn/認為有一件事你需要注意,你不能任意改變堆內存的大小,你只能在啟動JVM時設定它。

2. 河南北大青鳥:增加java堆空間方法

在大多數32位機、Sun的JVM上,Java的堆空間默認的大小為128MB,但也有例外,例如在32未Solaris操作系統(SPARC平台版本)上,默認的最大堆空間和起始堆空間大小為-Xms=3670K和-Xmx=64M。
對於64位操作系統,一般堆空間大小增加約30%。
但你使用Java1.5的throughput垃圾回收器,默認最大的堆大小為物理內存的四分之一,而起始堆大小為物理內存的十六分之一。
要想知道默認的堆大小的方法,可以用默認的設置參數打開一個程序,使用JConsole(JDK1.5之後都支持)來查看,在VMSummary頁面可以看到最大的堆大小。
用這種方法你可以根據你的程序的需要來改變堆內存大小,我強烈建議採用這種方法而不是默認值。
如果你的程序很大,有很多對象需要被創建的話,你可以用-Xmsand-Xmx這兩個參數來改變堆內存的大小。
Xms表示起始的堆內存大小,Xmx表示最大的堆內存的大小。
另外有一個參數-Xmn,它表示newgeneration(後面會提到)的大小。
河南電腦培訓http://www.kmbdqn.cn/認為有一件事你需要注意,你不能任意改變堆內存的大小,你只能在啟動JVM時設定它。

3. 磁碟緩存,虛擬內存,頁面文件,和物理內存的關系

如果它不存在,但是你能看見它 -- 它是虛擬的(IBM宣傳虛擬內存之用語)。虛擬內存技術是計算機發展史上的一項重要的技術,它幫助應用程序擺脫了「體積」的限制。

記得上大學時,有一本書好像叫做「計算機網路 - 自頂向下」,全名記不太清了。書中從人們接觸最多也最熟悉的「應用層」開始講,一直講到「物理層」,看完這本書後感覺效果不錯。所以按照這種方法我也嘗試著自上而下的去學習「虛存」,從我們最熟悉的C庫介面調用說起,一直談到底層的硬體支持設施。

1、初學者的疑惑
初學者往往都會寫出以下這樣的例子程序來學習malloc和free的使用。
int main() {
int *p = malloc(10000);
printf("p's address is 0x%p\n", p);
free(p);
return 0;
}
但往往結果讓這些初學者們感到疑惑。比如上述的例子,在SUN SPARC 64編譯後其輸出如下:
p's address is 0x100100dc0
看到這樣的結果,初學者往往心裡嘀咕,「這台機器物理內存才4G,其地址空間總共才4294967296(dec),而0x100100dc0轉換十進制為4296019392(dec),這個地址明顯已經超出了我的物理內存的限制,這是怎麼回事呢?」。其實這里的解釋很簡單:因為我們看到的都是「虛擬內存地址」。

2、「堆」為何物
malloc是個極其常見的內存分配介面函數,它主要負責運行時在「堆」上為程序動態分配內存空間。我們總是在口頭上談論著「堆」,那麼「堆」到底為何物呢?我們已經知道了有「虛擬地址」這個東西的存在,想必「堆」和「虛擬地址」有著千絲萬縷的聯系^_^。我們來翻看一些經典書籍中的描述。在CS.APP[注1]中的描述是這樣的:「堆是進程地址空間中的一段「虛擬地址」空間。在大多數的Unix系統中,堆是映射「二進制零區域(demand-zero)」實現的。其位置在bss段後,其增長方向為高地址方向」。

3、內存映射
前面談到「demand-zero」這個新名詞,那麼什麼叫「映射到demand-zero」呢?這里蘊含著一個極其重要的概念「內存映射」。內存映射好似一道橋梁,將放在物理磁碟上的對象和一段進程「虛擬地址」空間連接起來。磁碟上的對象,主要指的就是文件,在多數Unix的實現中支持兩種文件的內存映射,分別為Regular File和匿名文件(如demand-zero)。映射的過程大致為將文件分成若干「虛擬內存基本單元(頁)」大小存於「交換區」,直到CPU指令第一次訪問到某個單元時,這個單元才真正被載入到物理內存中。

4、虛擬內存,何方神聖
看到這是不是有些「雲里霧里」的感覺亞^_^。其實對於用戶進程來說,它是看不到CPU和OS是如何相互配合完成內存管理的。它只認為它面前的是一個這樣的情景:「一個完全被我擁有的CPU、一個從擁有M地址空間的物理內存(M = 2的n次方,n為地址匯流排寬度)...」。這里的用戶進程眼中的「物理內存」實際就是「虛擬內存」。虛擬意味著假象,我們知道一個用戶進程運行時可能僅僅佔用的物理內存的一小部分。看來用戶進程被欺騙了。而這個騙局是由操作系統和CPU共同布置的。為了讓這個騙局一直維持下去,CPU和OS還是做了很多工作的,究竟有哪些工作呢?我們一一來看看。

1) 交換區(swap)
為了支持虛擬內存,操作系統在物理內存、磁碟之間交換數據的基本單元為「頁」。頁的大小是固定的,其因操作系統而異。這樣一個用戶進程在被載入之前首先要被分成若干個「頁」,這些頁存儲在磁碟上。那麼是不是進程啟動後所有的頁都被載入到物理內存中呢?答案是NO。在當前的Unix操作系統中,都有一個叫「交換區」的地方,「交換區」在磁碟上,它存儲的是「已分配的虛擬內存頁」。又有些糊塗是吧,什麼叫已分配的頁呢?一個進程虛擬內存頁的載入流程大致是這樣的:一旦用戶進程一虛擬頁需要被載入,則操作系統會在「交換區」中為該頁分配一個頁,一旦CPU訪問的虛擬地址落入該頁地址空間,則該頁才被換入到物理內存中。在這個過程中虛擬頁有多個狀態,分別如下:
未分配的 - 進程虛擬頁未得到載入指令,仍安靜的待在磁碟上;
未緩存的 - OS為該進程虛擬頁在交換區分配了一個空間,但是該虛擬頁還未被引用;
已緩存的 - 該虛擬頁被引用,被載入到物理內存中。

2) 換入換出
物理內存容量有限,當物理內存無空間存儲新的內存頁的時候,就需要將某些內存頁從物理內存中移出以為新頁騰出空間。這個過程對於那些被移出的頁來說,就叫「換出」;相反對於那些新加入到物理內存中的頁來說就叫做「換入」。

5、從緩存角度看虛存
現代計算機的存儲體系是呈金字塔狀的。越接近頂層,速度越快,容量越小,價格越貴;越接近底層,速度越慢,容量越大,價格越低。這樣就形成了一個逐級緩存的機制。第K層設備永遠是第K+1層設備的緩存。按照這種說法,在早期計算機中,主存是磁碟的緩存,CPU內的高級Cache是主存的緩存。現代計算機基本都支持虛擬內存機制,而虛存頁是存儲在磁碟上的,虛存頁在主存中換入換出。按照緩存的概念,虛存屬於容量大,速度慢的第K+1層,而處於第K層的主存就可以看作是虛擬內存的緩存。那麼一切緩存理論就都可以應用在虛存和物理內存之間了,比如換入換出演算法等。

6、硬體支持
在支持虛擬內存機制的計算機中,CPU都是以虛擬地址形式生成指令地址或者數據地址的,而這個虛擬地址對於物理內存來說是不可見的,那麼是誰來屏蔽這個差異的呢?答案是MMU(Memory Management Unit)。MMU負責將CPU發出的虛擬地址轉換成相應的物理內存地址。MMU不是孤立工作的,OS為其提供了很好的支持,OS在物理內存中為MMU維護著一張全局的頁表,來幫助MMU找到正確地物理內存地址。

4. 廣東北大青鳥:增加java堆空間方法

在大多數32位機、Sun的JVM上,Java的堆空間默認的大小為128MB,但也有例外,例如在32未Solaris操作系統(SPARC平台版本)上,默認的最大堆空間和起始堆空間大小為-Xms=3670K和-Xmx=64M。
對於64位操作系統,一般堆空間大小增加約30%。
但你使用Java1.5的throughput垃圾回收器,默認最大的堆大小為物理內存的四分之一,而起始堆大小為物理內存的十六分之一。
要想知道默認的堆大小的方法,可以用默認的設置參數打開一個程序,使用JConsole(JDK1.5之後都支持)來查看,在VMSummary頁面可以看到最大的堆大小。
用這種方法你可以根據你的程序的需要來改變堆內存大小,我強烈建議採用這種方法而不是默認值。
如果你的程序很大,有很多對象需要被創建的話,你可以用-Xmsand-Xmx這兩個參數來改變堆內存的大小。
Xms表示起始的堆內存大小,Xmx表示最大的堆內存的大小。
另外有一個參數-Xmn,它表示newgeneration(後面會提到)的大小。
廣東電腦培訓http://www.kmbdqn.cn/認為有一件事你需要注意,你不能任意改變堆內存的大小,你只能在啟動JVM時設定它。

5. 江蘇北大青鳥:增加java堆空間方法

在大多數32位機、Sun的JVM上,Java的堆空間默認的大小為128MB,但也有例外,例如在32未Solaris操作系統(SPARC平台版本)上,默認的最大堆空間和起始堆空間大小為-Xms=3670K和-Xmx=64M。
對於64位操作系統,一般堆空間大小增加約30%。
但你使用Java1.5的throughput垃圾回收器,默認最大的堆大小為物理內存的四分之一,而起始堆大小為物理內存的十六分之一。
要想知道默認的堆大小的方法,可以用默認的設置參數打開一個程序,使用JConsole(JDK1.5之後都支持)來查看,在VMSummary頁面可以看到最大的堆大小。
用這種方法你可以根據你的程序的需要來改變堆內存大小,我強烈建議採用這種方法而不是默認值。
如果你的程序很大,有很多對象需要被創建的話,你可以用-Xmsand-Xmx這兩個參數來改變堆內存的大小。
Xms表示起始的堆內存大小,Xmx表示最大的堆內存的大小。
另外有一個參數-Xmn,它表示newgeneration(後面會提到)的大小。
江蘇電腦培訓http://www.kmbdqn.cn/認為有一件事你需要注意,你不能任意改變堆內存的大小,你只能在啟動JVM時設定它。

6. 堆的地址空間是多少到多少棧的地址空間是多少到多少怎麼判斷一個地址是在什麼地方

我想沒人能給出具體的值,針對不同系統,不同配置,不同設定,堆和棧地址及空間大小可能都是變化的,有的系統是操作系統本身提供的。要判斷一個地址是在什麼地方,首先需要知道堆棧的地址,PC較難獲取這個信息,至於單片機,大致可以從編譯信息的地址映像裡面獲知。

閱讀全文

與堆空間占物理空間的多少錢相關的資料

熱點內容
word中化學式的數字怎麼打出來 瀏覽:743
乙酸乙酯化學式怎麼算 瀏覽:1408
沈陽初中的數學是什麼版本的 瀏覽:1356
華為手機家人共享如何查看地理位置 瀏覽:1048
一氧化碳還原氧化鋁化學方程式怎麼配平 瀏覽:889
數學c什麼意思是什麼意思是什麼 瀏覽:1414
中考初中地理如何補 瀏覽:1306
360瀏覽器歷史在哪裡下載迅雷下載 瀏覽:706
數學奧數卡怎麼辦 瀏覽:1394
如何回答地理是什麼 瀏覽:1029
win7如何刪除電腦文件瀏覽歷史 瀏覽:1060
大學物理實驗干什麼用的到 瀏覽:1489
二年級上冊數學框框怎麼填 瀏覽:1705
西安瑞禧生物科技有限公司怎麼樣 瀏覽:986
武大的分析化學怎麼樣 瀏覽:1252
ige電化學發光偏高怎麼辦 瀏覽:1341
學而思初中英語和語文怎麼樣 瀏覽:1658
下列哪個水飛薊素化學結構 瀏覽:1427
化學理學哪些專業好 瀏覽:1490
數學中的棱的意思是什麼 瀏覽:1063