java的OutOfMemory问题 – 堆转储800 MB比configuration的最大堆小

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

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

(我应该提到,应用程序最近没有变化,但在该机器上一个新的oc4j和一个新的应用程序被部署了,并且吃了1-2g的ram)

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

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