簡體   English   中英

在64位Linux上發生意外的JVM行為

[英]Unexpected JVM behaviour on 64bit linux

我試圖比較32位Windows和64位Linux上的Java Web應用程序行為。

當我通過jconsole查看內存使用情況時,我發現內存使用情況的圖表非常不同。 在Windows上,應用程序永遠不會觸及512m。 但是,當我在具有64位VM的Linux 64位Linux上運行時,內存會逐漸增加,並很快很快達到峰值約1000m,而且我還收到與超出GC開銷限制有關的oome錯誤。 在Linux上,每當我手動運行GC時,它就會下降到小於100m。

就像GC似乎在Windows上一樣好運行。

在Windows上,該應用在負載更大的情況下運行效果更好。

我如何找到背后的原因?

IAM使用JDK1.6.0.13

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

編輯:

  • 您是否在Windows和Linux上使用相同的JVM版本?

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

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

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

    • 不確定。 我使用tomcat + spring + hibernate + jsf。
  • 這兩個平台上的Webapp配置是否還有其他差異? 沒有

  • 與OOME相關的錯誤消息到底是什么?

    • java.lang.OutOfMemoryError:超出了GC開銷限制
  • 您的Web應用程序開始在Linux上行為不正常/報告錯誤需要多長時間?

    • 在我讓它運行3個小時后,可以看到使用模式的差異。 該錯誤大約在一天或兩天后出現,因為此時可以看到平均內存使用量約為900 mb標志。

可以預料,與32位JVM相比,64位JVM自然會使用更多的內存(畢竟內部指針的大小是其兩倍)。 從32位遷移到64位時,您不能保持相同的堆設置,並且期望相同的行為。

如果您的應用在32位JVM上以512m的速度愉快地運行,則沒有任何理由使用64位JVM。 這樣做的唯一理由是利用巨大的堆大小。

請記住,在64位操作系統上運行32位JVM是完全有效的。 兩者無關。

有太多未知數無法解釋:

  • 您是否在Windows和Linux上使用相同的JVM版本?
  • 您是否在兩個系統上使用相同的垃圾收集器?
  • 您是否在兩個系統上使用相同的Web容器?
  • 您的Web應用程序是否依賴本機庫?
  • 這兩個平台上的Webapp配置是否還有其他差異?
  • 與OOME相關的錯誤消息到底是什么?
  • 您的Web應用程序開始在Linux上行為不正常/報告錯誤需要多長時間?

另外,我也同意@skaffman的觀點……除非您的應用程序確實需要它,否則請不要使用64位JVM。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM