2010-07-31 35 views
2

我試圖比較我在32位窗口和64位Linux上的java web應用行爲。在64位Linux上發生意外的JVM行爲

當我通過jconsole查看內存使用情況時,我發現內存使用情況非常不同。 在windows上,appl永遠不會碰到512m。 但是,當我運行64位的64位虛擬機的linux 64位內存保持逐漸增加,並非常快速地達到1000米左右的峯值,並且我還得到了與超過頭部限制的GC相關的oome錯誤。在Linux上,當我手動運行GC時,它會降到低於100米。

它像GC一樣運行得很好,因爲它在Windows上運行得很好。

在windows上,應用運行得更好,負載更大。

我如何找到背後的原因?使用

蔭jdk1.6.0.13

最小堆:512米和最大堆1024米

編輯:

  • 您使用的Windows和Linux上的同一個JVM版本?

    • yes.1.6.0.13。
  • 您是否在兩個系統上使用相同的垃圾回收器?

    • 我注意到在jconsole中,我發現gc是不同的。
  • 您是否在兩個系統上使用相同的Web容器?

    • yes.Tomcat。
  • 您的web應用程序是否依賴本機庫?

    • 不確定。我使用tomcat + spring + hibernate + jsf。
  • 在這兩個平臺上,您的webapp的配置是否存在其他差異? 否

  • 與OOME相關的錯誤信息究竟是什麼?

    • java.lang.OutOfMemoryError:GC開銷超過限制
  • 多久採取你的webapp啓動行爲不端在Linux /報告錯誤?

    • 使用模式的差異可以看出,我離開它跑了3小時後。這個錯誤出現在一天或兩天之後,然後平均內存使用率達到900 mb左右。
+0

您是否看到與Linux上的32位JVM具有相同的行爲? – 2010-07-31 15:48:25

+0

是的,我已經嘗試過64位linux上的32位jvm,並且與64位jvm相比,gc似乎更經常發生,但仍然與Windows(32位)相比,內存使用似乎朝着最大限制變高。 – jch 2010-07-31 16:01:23

回答

4

一個64位JVM自然會使用大量的內存比32位JVM,這是可以預期的(內部指針大小的兩倍,畢竟)。從32位移動到64位時,不能保持相同的堆設置,並且期望相同的行爲。

如果您的應用程序在32位JVM上以512m的高度運行,那麼沒有任何理由使用64位JVM。這樣做的唯一理由是利用巨大的堆大小。

記住,在64位操作系統上運行32位JVM是完全有效的。這兩個不相關。

+0

雖然如果您使用任何JNI,使用系統的默認位大小更好。讓您無需加載一組支持庫。 – 2011-11-30 21:59:55

1

有太多的未知數能夠解釋這一點:

  • 您使用的Windows和Linux上的同一個JVM版本?
  • 您是否在兩個系統上使用相同的垃圾收集器?
  • 您是否在兩個系統上使用相同的Web容器?
  • 您的web應用程序是否依賴本機庫?
  • 在這兩個平臺上,您的web應用程序的配置是否存在其他差異?
  • 什麼究竟是是與OOME相關的錯誤信息?
  • 您的Web應用程序需要多長時間才能在Linux上啓動錯誤/報告錯誤?

此外,我同意@skaffman ...除非您的應用程序真的需要它,否則不要使用64位JVM。