2011-03-18 65 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。