2011-03-18 56 views
2

我有一个Web应用程序部署在Oracle应用服务器10.1.3中,oc4j以1Gb初始堆和2 Gb最大堆为开始,位于32位RHEL上,配置为查看32 Gb的RAM。 最近我遇到了OutOfMemory错误,所以我配置了应用程序在OutOfMem上创建堆转储。所以我有4-5个堆转储,每个转储大小不超过1.2 Gb(因此比最大堆大小小800 Mb)。另外,平均每小时在机器上免费使用约20Gb的免费内存。java OutOfMemory问题 - 堆转储配置的最大堆小于800 Mb

这是否意味着应用程序试图一次性分配800 Mb?或者如果有2个或更多的线程同时尝试分配内存,那么它们都会失败,即使我们假设每个内存都有内存,但是并不是两者的总和?可能有一个与Linux机器的PB,也许它不能给Java内存?内存是否可以被碎片化,也许允许32位机器看到32 Gb内存的配置有pb?

(我应该提及的是,应用程序没有最新修改,但是这台机器上一个新的OC4J和新应用程序部署laely,而吃RAM的1-2G)

+0

根据suraj的回答,如果perm gen正在吃更多的空间,那么你有很强的参考objects.can你张贴堆转储。 – 2011-03-18 10:09:42

回答

2

在大多数32台机器(包括大多数linux),你的进程可以分配的最大内存大约是2G。现在,如果你说你的正在1.2G,那么在最坏的情况下,我会假设你烫发根是吃剩下的800M。尝试设置-XX:MaxPermSize参数= 200M和检查。

+0

嗯...这是非常有趣的...我有一个512M的转换.. 32位机器能够看到32Gb的RAM - 我认为它配置了PAE。在这种情况下,该进程是否可以获得超过2 Gb的RAM? – Laurentiu 2011-03-18 10:43:21

+0

我打算用256 M的Max Perm gen进行测试,看看会发生什么。非常感谢。 – Laurentiu 2011-03-18 11:27:37

+0

@Laurentiu是的,这会给你一个更好的图片。 – 2011-03-18 12:00:24

0

我认为你的问题是你为整个App服务器分配1G-2G堆大小。它本身消耗一些内存,不知道多少。但是,如果你使用最大2G内存启动应用程序服务器,那么你的Web应用程序的可用内存将少于2G。