2012-07-26 136 views
0

當我啓動JVM時,它至少保留{{xms}}內存,對嗎?這意味着這個內存對於JVM進程來說是私有的(它是malloced),是嗎? 當JVM需要增加堆(malloc)更多的內存時。但多少? 我不相信它保留完全一樣多,因爲它可能有一定的步驟(池?)大小。Java堆/池大小

如何配置「步長」?

直到達到{{xmx}},OOM被拋出的所有事情,對嗎?

當JVM啓動GC時?不是當涉及到xmx,而是涉及到保留堆大小(此池的頂部)?

如果是這樣,最好將xms設置爲接近xmx以防止許多無用的GC。 我將有一個巨大的GC而不是很多小的GC,每個GC都會凍結我的JVM,所以最好有一個,對嗎?

回答

0

您對開關的含義是正確的。

記得開關的方式是

XM * 小號以 「s」 像 「* 小號 * tarting存儲器」 * =完。

XM * X * =以「X」狀端部「馬* X * imum記憶」

它是由一個給定的JVM來決定如何從起始內存移動到最大記憶。假設兩者並不平凡,彼此之間的分配將在我意識到的所有JVM的步驟中發生。

我不知道有任何選項來控制任何JVM中的步驟的大小。當然沒有標準選項。

不同的JVM有不同的GC策略。一些JVM允許您使用多種GC策略之一,由命令行開關控制。

5

當JVM需要增加堆(mallocs)更多的內存時。但多少?

你不應該真的在意。它只是作品。許多建議使用相同的XmxXms,以便JVM在啓動時分配所有內存。這是合理的,請進一步閱讀。

如何配置「步長」?

它不能,它是完全實現,可能與操作系統有關。

當JVM啓動GC時?不是當涉及到xmx,而是涉及到保留堆大小(此池的頂部)?

GC比你想象的要複雜一點。次要GC被執行時年輕代被填滿。主要的GC被稱爲老一代沒有剩餘空間。

直到達到{{xmx}}並且引發OOM的所有事情,對吧?

不,到達Xmx時,JVM穩定下來,沒有發生任何錯誤。在GC之後立即拋出OutOfMemoryError,JVM無法爲新對象找到足夠的空間(這是一個主要的簡化)。

如果是這樣,最好將xms設置爲接近xmx以防止許多無用的GC。

再次,您必須瞭解GC的工作原理。使用Xmx等於Xms是一個不錯的選擇,因爲它可以避免在應用程序運行時發生不必要的分配(所有事情都在啓動時發生,沒有進一步的開銷)。 GC與此無關。

代替許多小孩,每個GC都會凍結我的JVM,所以最好有一個,對嗎?

沒有。小GC通常需要幾十毫秒,幾乎看不見,除非您正在實時系統上工作。主要(停止世界)GC可能需要幾秒鐘,對於最終用戶來說肯定是顯而易見的。在正確調優的JVM中,主要的GC應該很少出現。

+0

關於未成年人和主要收藏品,只要確保你的-Xmn即你的伊甸園佔有率不太小。我認爲默認值是1:3,但我通常更喜歡1:10。但這完全取決於您的應用程序。 – ddd 2012-07-27 21:31:00