2

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

这是否意味着应用程序尝试一次性分配 800 Mb?或者,如果有 2 个或更多线程同时尝试分配内存,它们都会失败,即使假设每个线程都有内存,但两者的总和却没有?linux机器上会不会有pb,也许它不能给java内存?内存会不会碎片化,也许让32位机器看到32 Gb ram的配置有pb?

(我应该提到应用程序最近没有改变,但是在那台机器上部署了一个新的 oc4j 和一个新的应用程序,并且吃掉了 1-2g 的内存)

4

2 回答 2

2

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

于 2011-03-18T09:54:35.943 回答
0

我认为您的问题是您为整个 App 服务器分配了 1G-2G 的堆大小。它本身会消耗一些内存,不确定多少。但是,如果您以最大 2G 内存启动 App 服务器,您的 webapp 可用的内存肯定少于 2G。

于 2011-03-18T09:57:03.310 回答