内存溢出_关于PermGen Space内存溢出解决方案
內存溢出分為Heap Space和PermGen Space兩種異常。正巧的是我這次就碰到了PermGen space異常,為了解決這個異常花了我 半天的時間,所以今天寫這個方案就是做一種筆記。
剛開始碰到這個內存溢出的問題的時候,我一直沒有去管他,因為開發時間緊我不得不放棄這些系統拋出的異常。
廢話不多說了,先來看看這次內存溢出到底是怎么一回事。
啟動tomcat沒有問題,并且還能夠訪問,但是當你訪問的頁面越來越多的時候,會突然間蹦出一個PermGen space內存溢出的異常。其實這個問題看起來是很簡單的,只要修改一下永久域的大小就可以了。于是我的同事就發給我一段修改永久域大小的代碼:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=128m"(Xms堆內存初始值,Xmx堆內存最大值,為什么Xms和Xmx要設置一樣大呢,因為如果你設置Xms初始值和Xms不一樣,那么每次內存增大的時候都需要重新分配內存給堆,這樣的每次增大都會相應的浪費時間。所以干脆設置Xms和Xmx一樣。Xx:permsize是永久域的初始值,xx:maxpersize是最大分配的永久域空間,xx:maxnewsize是新域最大值)
把這段代碼放到tomcatbin目錄下的catalina.bat文件(Linux修改catalina.sh)的第一行就可以了。弄好之后以為ok了。結果,結果。。。。
還是報PermGen Space內存溢出,我在想是不是空間還不夠大,于是把XX:PermSize設置512M,XX:MaxPermSize設置1024M。
滿懷信心的一式結果崩潰了,還是報內存溢出,我還在想是不是內存空間分配的不夠大啊,于是我又加大內存,結果一次次的失敗。
于是我就在想到底是哪里需要分配這么大的內存,于是我換了一條思路,我來找哪里消耗的內存最大,于是找到一種工具就是jvm自帶的,打開cmd然后輸入jconsole,會彈出一個對話框,如圖:
我選擇遠程進程,如何來設置這個遠程進程連接呢:
打開Catalina.bat文件,然后找到rem -----Execute The Requested Command
在這個下面加入以下代碼:
set JAVA_OPTS= %JAVA_OPTS% -Djava.rmi.server.hostname=xxx.xx.xx.xx (ip)
set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.port=xxxx(端口)
set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl=false
set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false(如果為true就需要賬號密碼,這里為false簡單點)
現在把ip和端口輸入jconsole里面進行遠程連接:
選擇“內存”---“Ps Perm Gen”發現分配的內存還是只有80多M,我不是已經分配了2個G的內存給permGen space嗎,為什么這里還是80多m呢。
猛然間想到是不是分配內存的代碼錯了
于是乎開始尋找新的內存分配代碼這一次就有了下面這一段代碼:
set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
給永久域初始值分配128M,然后再用jconsole來查看,發現permGen space不報內存溢出了。哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈啊哈哈哈哈哈哈啊
總結
以上是生活随笔為你收集整理的内存溢出_关于PermGen Space内存溢出解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 是什么包_包粽子教程,喜欢的收藏,以后想
- 下一篇: python某行某列读取数据_使用scr