我在Oracle App Server10.1.3中部署了一个web应用程序,在oc4j中,初始堆大小为1 Gb,最大堆大小为2 Gb,部署在32位RHEL上,配置为查看32 Gb内存。最近我遇到了OutOfMemory错误,所以我配置应用程序在OutOfMem上创建堆转储。所以我有4-5个堆转储,每个转储的大小不超过1.2 Gb (所以比最大堆大小小800Mb)。此外,在机器上执行平均小时的空闲显示大约20 of的空闲内存。
这是否意味着应用程序尝试一次性分配800Mb?或者,如果有2个或更多线程同时尝试分配内存,它们都会失败,即使假设每个线程都有内存,但不是两个线程的总和?linux机器上可能有一个pb,也许它不能给java提供内存?内存可能是碎片化的吗,也许允许32位机器看到32 Gb内存的配置具有pb?
(我应该指出的是,应用程序最近没有更改,但是在那台机器上部署了一个新的oc4j和一个新的应用程序,并且占用了1-2g的内存)
发布于 2011-03-18 17:54:36
在大多数32位机器(包括大多数版本的linux)中,您的进程可以分配的最大内存大约是2G。现在,如果您说您的堆正在使用1.2G,那么在最坏的情况下,我会假设您的perm gen正在使用rest 800M.Try setting -XX:MaxPermSize=200M和check。
发布于 2011-03-18 17:57:03
我认为你的问题是你为整个App服务器分配了1G-2G的堆大小。它自己消耗了一些内存,不确定有多少。但是如果你用最大2G的内存启动App服务器,你的webapp的可用空间肯定不到2G。
https://stackoverflow.com/questions/5350251
复制相似问题