JVM管理2種內存,堆和非堆,堆啟動時候創建,給開發人員用;非堆給JVM自己用,存放類信息,和堆不同,非堆內存運行期間GC不釋放。下面西安達內培訓(http://www.xatarena.cn)講師就Java內存溢出出現的常見知識點詳細為大家介紹,有何疑問可咨詢西安達內講師。
一、常見的Java內存溢出有以下三種:
1. java.lang.OutOfMemoryError: Java heap space----JVM Heap(堆)溢出
在JVM中如果98%的時間是用于GC,且可用的Heap size 不足2%的時候將拋出此異常信息。
解決方法:手動設置JVM Heap(堆)的大小。
2. java.lang.OutOfMemoryError: PermGen space ---- PermGen space溢出。
解決方法: 手動設置MaxPermSize大小
3. java.lang.StackOverflowError ---- 棧溢出
通常來講,一般棧區遠遠小于堆區的,因為函數調用過程往往不會多于上千層,而即便每個函數調用需要 1K的空間(這個大約相當于在一個C函數內聲明了256個int類型的變量),那么棧區也不過是需要1MB的空間。通常棧的大小是1-2MB的。
通常遞歸也不要遞歸的層次過多,很容易溢出。
解決方法:修改程序。
二、解決方法
在生產環境中tomcat內存設置不好很容易出現jvm內存溢出。
1、linux下的tomcat:
2、如果tomcat 5 注冊成了windows服務,以services方式啟動的,則需要修改注冊表中的相應鍵值。
3、如果tomcat 6 注冊成了windows服務,或者windows2003下用tomcat的安裝版,在/bin/tomcat6w.exe里修改就可以了 .
4、如果要在myeclipse中啟動tomcat
三、jvm參數說明:
如果 JVM 的堆大小大于 1GB,則應該使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者將堆的總大小的 50% 到 60% 分配給新生成的池。調大新對象區,減少Full GC次數。 |
|