2012-08-10 60 views
0

我知道JDK 7應該是hotspot和jrockit之間的合併,並且不會有jrockit 1.7。 (來源:https://blogs.oracle.com/henrik/entry/java_7_questions_answers)我有一個項目需要jrockit的非連續堆特性以及一些java 1.7特性,因爲由於JDK 7是一個合併器,它是否支持非連續堆,因爲我找不到一個官方這樣說的文檔?JDK 7是否使用非連續堆?

+3

在您的鏈接頁面上,您的問題未得到解答,問題是「融合的JVM是否會獲得允許JRockit在Windows上分配更多堆的功能?」 – 2012-08-10 10:10:34

回答

2

我認爲你問的是非連續的堆,因爲你正在遭受內存碎片。很多時候你的32位地址空間是分段的,但你的64位地址空間不是。這意味着,如果您的計算機具有足夠的內存,則使用64位JVM將允許您查找32位JVM不會訪問的連續內存。當32位JVM未能分配超過2GB的堆時,我個人使用64位JVM來分配超過4GB的堆。

雖然它看起來不像任意的非連續堆,但它使它成爲JDK 7,您可以嘗試使用G1垃圾回收器。根據http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html

堆被劃分爲一組大小相等的堆區域,每個虛擬存儲器的連續範圍的。

從理論上講,這可以讓你玩一個非連續的堆。唯一的限制是地區必須具有相同的規模。

根據http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html#t6可以使用該命令行選項來控制區域大小:

-XX:G1HeapRegionSize =正:隨着G1 Java堆被細分成均勻大小的區域。這設定了各個子部門的大小。該參數的默認值根據堆大小以人體工程學方式確定。最小值爲1Mb,最大值爲32Mb。

我希望這會有所幫助。

+0

聽起來不錯,但我做了一些測試,它表現相同。他們可能意味着連續的堆被分割以獲得更好的GC。 但有些奇怪。我指定1g和visualVM顯示我最多2g ... – Stroboskop 2014-07-29 17:22:01