我在 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 的内存)