1. 程式人生 > >java專案執行中出現記憶體洩漏問題,報java.lang.OutOfMemoryError: PermGen space

java專案執行中出現記憶體洩漏問題,報java.lang.OutOfMemoryError: PermGen space

一開始我以為是記憶體不足導致的,但是檢視伺服器記憶體還有很多。所以不是記憶體問題。

然後查到java執行時涉及到資源分配的幾個重要引數:

  • Xss:每個執行緒的stack大小(棧)
  • Xmx:JAVA HEAP的最大值、預設為實體記憶體的1/4
  • Xms:JAVA HEAP的初始值,server端最好Xms與Xmx一樣
  • Xmn:JAVA HEAP young區的大小
  • XX:PermSize:設定記憶體的永久儲存區域
  • XX:MaxPermSize:設定最大記憶體的永久儲存區域

而我遇到的問題正是permsize設定過小導致的。由於專案後期開發會越來越大,涉及到的類也會越來越多,導致虛擬機器分配的資源不夠類載入的使用。

----PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域

這個引數一旦分配了就不會改變。所以只要設定到足夠專案使用的資源分配值就能解決問題了。

在這個過程中,我們可以使用java提供的命令來檢視專案使用資源的具體情況,從而設定合適的資源分配,而不是過大浪費資源。

1 使用     ps -ef | grep java | grep '專案名'  | awk  $'{print $2}'  命令查出專案的pid

2 根據pid號   jmap -heap pid 檢視專案具體使用資源情況

配置

使用

很明顯可以看出目前的PermGen space 的記憶體是足夠使用的。

以上就是解決問題的整體思路,下面是解決辦法

到tomcat的bin目錄下,找到catalina.sh (linux系統)  或者 catalina.bat (windows系統)

新增   JAVA_OPTS="-server -XX:PermSize=90M  -XX:MaxPermSize=150m -Djava.awt.headless=true "

這裡面的引數是根據你專案需求的資源分配的,不要分配過大,以免浪費資源,記憶體是寶貴的~

最後說一下就是jdk的這些引數都是需要做不同的優化的,一般情況下預設就可以運行了,但是為了後期專案的良好執行,最好能夠對資源的分配做不同的調整。專案分開到獨立的tomcat可以讓專案的資源利用更加合理。