64位Linux上出现意外的JVM行为

时间:2010-07-31 15:35:34

标签: java jvm 32bit-64bit

我试图在32位Windows和64位Linux上比较我的java Web应用程序行为。

当我通过jconsole查看内存使用情况时,我发现内存使用情况的图表非常不同。 在Windows上,appl从不接触512米。 但是当我在64位VM的linux 64bit上运行时,内存会逐渐增加,并且非常快地达到峰值约1000米,并且我也会遇到与GC超出限制相关的oome错误。在Linux上,每当我手动运行GC时,它都会低于100米。

就像GC似乎在Windows上运行得那么好。

在Windows上,应用程序运行得更好,负载更大。

我如何找到背后的原因?

我使用jdk1.6.0.13

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

编辑:

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

    • yes.1.6.0.13。
  • 您是否在两个系统上使用相同的垃圾收集器?

    • 我在jconsole中注意到,我发现gc是不同的。
  • 您是否在两个系统上使用相同的Web容器?

    • yes.Tomcat。
  • 您的网络应用程序是否依赖本机库?

    • 不确定。我使用tomcat + spring + hibernate + jsf。
  • 两个平台上的webapp配置是否存在其他差异?   否

  • 与OOME关联的错误消息究竟是什么?

    • java.lang.OutOfMemoryError:超出GC开销限制
  • 您的网络应用程序在Linux上启动行为不端/报告错误需要多长时间?

    • 使用模式的差异是在我让它运行3小时后看到的。在一天或两天之后出现错误,因为那时avg内存使用量大约为900 mb。

2 个答案:

答案 0 :(得分:4)

64位JVM自然会比32位JVM使用更多的内存,这是可以预料的(毕竟内部指针是两倍大小)。当从32位移动到64位时,你不能保持相同的堆设置,并期望相同的行为。

如果您的应用程序在32位JVM上以512米高速运行,则没有任何理由使用64位JVM。这样做的唯一理由是利用巨大的堆大小。

记住,在64位操作系统上运行32位JVM是完全有效的。这两者无关。

答案 1 :(得分:1)

有太多未知因素可以解释这个:

  • 您是在Windows和Linux上使用相同的JVM版本吗?
  • 您是否在两个系统上使用相同的垃圾收集器?
  • 您是否在两个系统上使用相同的Web容器?
  • 您的网络应用程序是否依赖本机库?
  • 两个平台上的webapp配置是否存在其他差异?
  • 完全与OOME关联的错误消息是什么?
  • 您的网络应用程序在Linux上启动行为不端/报告错误需要多长时间?

此外,我同意@skaffman ...除非您的应用程序确实需要,否则不要使用64位JVM。