我试图在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版本?
您是否在两个系统上使用相同的垃圾收集器?
您是否在两个系统上使用相同的Web容器?
您的网络应用程序是否依赖本机库?
两个平台上的webapp配置是否存在其他差异? 否
与OOME关联的错误消息究竟是什么?
您的网络应用程序在Linux上启动行为不端/报告错误需要多长时间?
答案 0 :(得分:4)
64位JVM自然会比32位JVM使用更多的内存,这是可以预料的(毕竟内部指针是两倍大小)。当从32位移动到64位时,你不能保持相同的堆设置,并期望相同的行为。
如果您的应用程序在32位JVM上以512米高速运行,则没有任何理由使用64位JVM。这样做的唯一理由是利用巨大的堆大小。
记住,在64位操作系统上运行32位JVM是完全有效的。这两者无关。
答案 1 :(得分:1)
有太多未知因素可以解释这个:
此外,我同意@skaffman ...除非您的应用程序确实需要,否则不要使用64位JVM。