Java 64位linux上的意外JVM行为

Java 64位linux上的意外JVM行为,java,jvm,32bit-64bit,Java,Jvm,32bit 64bit,我试图比较我的java web应用在32位windows和64位linux上的行为 当我通过jconsole查看内存使用情况时,我发现内存使用情况的图表非常不同。 在windows上,应用程序从不触及512m。 然而,当我在64位linux和64位虚拟机上运行时,内存会逐渐增加,并很快达到1000m左右的峰值,同时我也会遇到与超出GC上限相关的oome错误。在linux上,每当我手动运行GC时,它就会降到100米以下 就像GC在windows上运行得一样好 在windows上,应用程序运行得更好

我试图比较我的java web应用在32位windows和64位linux上的行为

当我通过jconsole查看内存使用情况时,我发现内存使用情况的图表非常不同。 在windows上,应用程序从不触及512m。 然而,当我在64位linux和64位虚拟机上运行时,内存会逐渐增加,并很快达到1000m左右的峰值,同时我也会遇到与超出GC上限相关的oome错误。在linux上,每当我手动运行GC时,它就会降到100米以下

就像GC在windows上运行得一样好

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

我如何找到这背后的原因

使用jdk1.6.0.13的Iam

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

编辑:

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

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

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

是的,雄猫。 您的Web应用程序是否依赖本机库

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

与OOME关联的错误消息到底是什么

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

使用模式的差异是在我让它运行3小时后看到的。该错误会在一天或两天之后出现,因为此时平均内存使用量约为900 mb。
64位JVM自然会比32位JVM使用更多的内存,这是意料之中的,毕竟内部指针的大小是32位JVM的两倍。当从32位移动到64位时,不能保持相同的堆设置,并期望相同的行为

如果您的应用程序在32位JVM上的512m中运行良好,那么就没有理由使用64位JVM。这样做的唯一理由是利用巨大的堆大小


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

有太多的未知因素无法解释这一点:

您是否在Windows和Linux上使用相同的JVM版本? 您是否在两个系统上使用相同的垃圾收集器? 您是否在两个系统上使用相同的web容器? 您的Web应用程序是否依赖本机库? 这两种平台上的webapp配置是否存在其他差异? 与OOME关联的错误消息到底是什么? 您的Web应用程序在Linux上开始行为不端/报告错误需要多长时间?
此外,我同意@skaffman。。。除非您的应用程序确实需要64位JVM,否则不要使用它。

您在Linux上看到32位JVM的相同行为了吗?是的,我在64位Linux上尝试了32位JVM,与64位JVM相比,gc似乎发生得更频繁,但与Windows 32位JVM相比,内存使用似乎更接近最大限制。尽管您使用了32位JVMJNI最好使用系统的默认位大小。使您无需加载两套支持库。