java常見的幾種記憶體溢位和解決方案
專案組最近在開發中經常會出現一些意想不到的記憶體溢位問題。下面我就說說我們常見的幾種記憶體溢位吧!
1.JVM Heap(堆)溢位:java.lang.OutOfMemoryError: Java heap space
JVM在啟動的時候會自動設定JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設定。Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的時間是用於GC,且可用的Heap size 不足2%的時候將丟擲此異常資訊。
解決方法:手動設定JVM Heap(堆)的大小。
2.PermGen space溢位: java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域。為什麼會記憶體溢位,這是由於這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同,sun的 GC不會在主程式執行期對PermGen space進行清理,所以如果你的APP會載入很多CLASS的話,就很可能出現PermGen space溢位。一般發生在程式的啟動階段。
解決方法: 通過-XX:PermSize和-XX:MaxPermSize設定永久代大小即可。
3.棧溢位: java.lang.StackOverflowError : Thread Stack space
棧溢位了,JVM依然是採用棧式的虛擬機器,這個和C和Pascal都是一樣的。函式的呼叫過程都體現在堆疊和退棧上了。呼叫建構函式的 “層”太多了,以致於把棧區溢位了。 通常來講,一般棧區遠遠小於堆區的,因為函式呼叫過程往往不會多於上千層,而即便每個函式呼叫需要 1K的空間(這個大約相當於在一個C函式內宣告瞭256個int型別的變數),那麼棧區也不過是需要1MB的空間。通常棧的大小是1-2MB的。通俗一點講就是單執行緒的程式需要的記憶體太大了。 通常遞迴也不要遞迴的層次過多,很容易溢位。
解決方法:1:修改程式。2:通過 -Xss: 來設定每個執行緒的Stack大小即可。
4.but has failed to stop it. This is very likely to create a memory leak.
這一般是啟動程式時一些定時器或其他正在操作的執行緒還沒有停掉造成的。
解決方法:實現ServletContextListener的監聽,在contextDestroyed方法中進行關閉。
5. 所以Server容器啟動的時候我們經常關心和設定JVM的幾個引數如下:
-Xms:java Heap初始大小, 預設是實體記憶體的1/64。
-Xmx:ava Heap最大值,不可超過實體記憶體。
-Xmn:young generation的heap大小,一般設定為Xmx的3、4分之一 。增大年輕代後,將會減小年老代大小,可以根據監控合理設定。
-Xss:每個執行緒的Stack大小,而最佳值應該是128K,預設值好像是512k。
-XX:PermSize:設定記憶體的永久儲存區初始大小,預設值為64M。
-XX:MaxPermSize:設定記憶體的永久儲存區最大大小,預設值為64M。
-XX:SurvivorRatio:Eden區與Survivor區的大小比值,設定為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區佔整個年輕代的1/10
-XX:+UseParallelGC:F年輕代使用併發收集,而年老代仍舊使用序列收集.
-XX:+UseParNewGC:設定年輕代為並行收集,JDK5.0以上,JVM會根據系統配置自行設定,所無需再設定此值。
-XX:ParallelGCThreads:並行收集器的執行緒數,值最好配置與處理器數目相等 同樣適用於CMS。
-XX:+UseParallelOldGC:年老代垃圾收集方式為並行收集(Parallel Compacting)。
-XX:MaxGCPauseMillis:每次年輕代垃圾回收的最長時間(最大暫停時間),如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。
-XX:+ScavengeBeforeFullGC:Full GC前呼叫YGC,預設是true。
1.JVM Heap(堆)溢位:java.lang.OutOfMemoryError: Java heap space
JVM在啟動的時候會自動設定JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設定。Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的時間是用於GC,且可用的Heap size 不足2%的時候將丟擲此異常資訊。
解決方法:手動設定JVM Heap(堆)的大小。
2.PermGen space溢位: java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域。為什麼會記憶體溢位,這是由於這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同,sun的 GC不會在主程式執行期對PermGen space進行清理,所以如果你的APP會載入很多CLASS的話,就很可能出現PermGen space溢位。一般發生在程式的啟動階段。
解決方法: 通過-XX:PermSize和-XX:MaxPermSize設定永久代大小即可。
3.棧溢位: java.lang.StackOverflowError : Thread Stack space
棧溢位了,JVM依然是採用棧式的虛擬機器,這個和C和Pascal都是一樣的。函式的呼叫過程都體現在堆疊和退棧上了。呼叫建構函式的 “層”太多了,以致於把棧區溢位了。 通常來講,一般棧區遠遠小於堆區的,因為函式呼叫過程往往不會多於上千層,而即便每個函式呼叫需要 1K的空間(這個大約相當於在一個C函式內宣告瞭256個int型別的變數),那麼棧區也不過是需要1MB的空間。通常棧的大小是1-2MB的。通俗一點講就是單執行緒的程式需要的記憶體太大了。 通常遞迴也不要遞迴的層次過多,很容易溢位。
解決方法:1:修改程式。2:通過 -Xss: 來設定每個執行緒的Stack大小即可。
4.but has failed to stop it. This is very likely to create a memory leak.
這一般是啟動程式時一些定時器或其他正在操作的執行緒還沒有停掉造成的。
解決方法:實現ServletContextListener的監聽,在contextDestroyed方法中進行關閉。
5. 所以Server容器啟動的時候我們經常關心和設定JVM的幾個引數如下:
-Xms:java Heap初始大小, 預設是實體記憶體的1/64。
-Xmx:ava Heap最大值,不可超過實體記憶體。
-Xmn:young generation的heap大小,一般設定為Xmx的3、4分之一 。增大年輕代後,將會減小年老代大小,可以根據監控合理設定。
-Xss:每個執行緒的Stack大小,而最佳值應該是128K,預設值好像是512k。
-XX:PermSize:設定記憶體的永久儲存區初始大小,預設值為64M。
-XX:MaxPermSize:設定記憶體的永久儲存區最大大小,預設值為64M。
-XX:SurvivorRatio:Eden區與Survivor區的大小比值,設定為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區佔整個年輕代的1/10
-XX:+UseParallelGC:F年輕代使用併發收集,而年老代仍舊使用序列收集.
-XX:+UseParNewGC:設定年輕代為並行收集,JDK5.0以上,JVM會根據系統配置自行設定,所無需再設定此值。
-XX:ParallelGCThreads:並行收集器的執行緒數,值最好配置與處理器數目相等 同樣適用於CMS。
-XX:+UseParallelOldGC:年老代垃圾收集方式為並行收集(Parallel Compacting)。
-XX:MaxGCPauseMillis:每次年輕代垃圾回收的最長時間(最大暫停時間),如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。
-XX:+ScavengeBeforeFullGC:Full GC前呼叫YGC,預設是true。
例項如:JAVA_OPTS=”-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6″
好了就到這裡吧!歡迎大家關注我的部落格,如有疑問,請加qq群:454796847、135430763 共同進步!
相關文章
- 異常、堆記憶體溢位、OOM的幾種情況記憶體溢位OOM
- 【Java】幾種典型的記憶體溢位案例,都在這兒了!Java記憶體溢位
- Java棧溢位|記憶體洩漏|記憶體溢位Java記憶體溢位
- JAVA記憶體區域與記憶體溢位異常Java記憶體溢位
- Java記憶體溢位Java記憶體溢位
- jvm記憶體設定及記憶體溢位、解決方案JVM記憶體溢位
- JVM(2)-Java記憶體區域與記憶體溢位異常JVMJava記憶體溢位
- Java程式碼執行記憶體溢位詳解及解決方案Java記憶體溢位
- 記憶體溢位記憶體溢位
- 阿里大佬講解Java記憶體溢位示例(堆溢位、棧溢位)阿里Java記憶體溢位
- Java記憶體區域與記憶體溢位異常(JVM學習系列1)Java記憶體溢位JVM
- JVM學習-02-Java記憶體區域與記憶體溢位異常JVMJava記憶體溢位
- java記憶體溢位和記憶體洩漏的區別Java記憶體溢位
- Android記憶體溢位、記憶體洩漏常見案例分析及最佳實踐總結Android記憶體溢位
- Java EasyExcel 匯出報記憶體溢位如何解決JavaExcel記憶體溢位
- [Java基礎]記憶體洩漏和記憶體溢位Java記憶體溢位
- Java記憶體區域與記憶體溢位異常 - 執行時資料區Java記憶體溢位
- Java虛擬機器01——Java記憶體資料區域和記憶體溢位異常Java虛擬機記憶體溢位
- 深入理解Java虛擬機器-Java記憶體區域與記憶體溢位異常Java虛擬機記憶體溢位
- Windows Tomcat 記憶體溢位解決方法WindowsTomcat記憶體溢位
- 記憶體溢位和記憶體洩露記憶體溢位記憶體洩露
- Jmeter記憶體溢位:java.lang.OutOfMemoryError: Java heap space解決思路JMeter記憶體溢位JavaError
- Java記憶體溢位OutOfMemoryError的產生與排查Java記憶體溢位Error
- JVM 發生記憶體溢位的 8 種原因、及解決辦法JVM記憶體溢位
- tomcat記憶體溢位:PermGen space解決方法Tomcat記憶體溢位
- 【記憶體洩漏和記憶體溢位】JavaScript之深入淺出理解記憶體洩漏和記憶體溢位記憶體溢位JavaScript
- 記錄佇列序列化模型導致的記憶體溢位的解決方案佇列模型記憶體溢位
- JVM——記憶體洩漏與記憶體溢位JVM記憶體溢位
- react 記憶體洩露常見問題解決方案React記憶體洩露
- 直播平臺搭建,Java 記憶體溢位的排查方法Java記憶體溢位
- 手動寫java記憶體溢位 java.lang.StackOverflowErrorJava記憶體溢位Error
- Java服務假死後續之記憶體溢位Java記憶體溢位
- tomcat伺服器記憶體溢位解決方法Tomcat伺服器記憶體溢位
- JavaScript之記憶體溢位和記憶體洩漏JavaScript記憶體溢位
- Java記憶體模型常見問題Java記憶體模型
- 關於 PHP 記憶體溢位的思考PHP記憶體溢位
- java向excel 寫入海量資料記憶體溢位問題 解決JavaExcel記憶體溢位
- return new物件造成溢位記憶體物件記憶體
- mybatis-plus getOne 記憶體溢位MyBatis記憶體溢位