解決 - java.lang.OutOfMemoryError: unable to create new native thread

來源:互聯網
上載者:User

標籤:

曾常常遇到此問題,一般想法就是改動配置啟動參數,想方設法增大參數,覺得這樣能夠避免記憶體溢出。但效果基本上還是會出錯。我在網上找到了一篇文章解決此問題 點擊開啟連結 主要觀點為

這個異常問題本質原因是我們建立了太多的線程,而能建立的線程數是有限制的,導致了異常的發生。能建立的線程數的詳細計算公式例如以下:(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threadsMaxProcessMemory 指的是一個進程的最大記憶體JVMMemory         JVM記憶體ReservedOsMemory  保留的作業系統記憶體ThreadStackSize      線程棧的大小在java語言裡, 當你建立一個線程的時候,虛擬機器會在JVM記憶體建立一個Thread對象同一時候建立一個作業系統線程,而這個系統線程的記憶體用的不是JVMMemory,而是系統中剩下的記憶體(MaxProcessMemory - JVMMemory - ReservedOsMemory)。 

由公式得出結論:你給JVM記憶體越多,那麼你能建立的線程越少,越easy發生java.lang.OutOfMemoryError: unable to create new native thread。 

解決這個問題:1, 假設程式中有bug,導致建立大量不須要的線程或者線程沒有及時回收,那麼必須解決這個bug,改動參數是不能解決這個問題的。2, 假設程式確實須要大量的線程,現有的設定不能達到要求,那麼能夠通過改動MaxProcessMemory,JVMMemory,ThreadStackSize這三個因素,來添加能建立的線程數:a, MaxProcessMemory 使用64位作業系統b, JVMMemory   降低JVMMemory的分配c, ThreadStackSize  減小單個線程的棧大小

這個觀點讓我開始也非常不解,但細緻查看了一下出錯日誌

# There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (malloc) failed to allocate 2334888 bytes for Chunk::new# An error report file with more information is saved as:# D:\xxx_err_pid1904.log
在查看具體的pid日誌,則驚喜的發現其給出的解決方案與上面講到的理論同樣

## There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (malloc) failed to allocate 2355528 bytes for Chunk::new# Possible reasons:#   The system is out of physical RAM or swap space#   In 32 bit mode, the process size limit was hit# Possible solutions:#   Reduce memory load on the system#   Increase physical memory or swap space#   Check if swap backing store is full#   Use 64 bit Java on a 64 bit OS#   <span style="color:#FF0000;">Decrease Java heap size (-Xmx/-Xms)</span>#   <span style="color:#FF0000;">Decrease number of Java threads</span>#   <span style="color:#FF0000;">Decrease Java thread stack sizes (-Xss)</span>#   Set larger code cache with -XX:ReservedCodeCacheSize=# This output file may be truncated or incomplete.##  Out of Memory Error (allocation.cpp:328), pid=4308, tid=6720## JRE version: 7.0_25-b16# Java VM: Java HotSpot(TM) Server VM (23.25-b01 mixed mode windows-x86 )# Failed to write core dump. Call to MiniDumpWriteDump() failed#
注意上面標紅色處
於是將tomcat服務啟動參數都改小了一半,變為例如以下參數

-Xms256M-Xmx512M-Xss1M

再啟動服務,並馬上觀察任務管理中tomcat進程具體,記憶體使用量情況較出錯時記憶體使用量上漲的最大值小了,並逐漸回落到一個比較低的值。而CPU的使用方式在剛啟動時比出錯時值要高一點,啟動後迴歸正常。而且服務能夠正常啟動了。

綜合上面的情況,並在簡單的實踐後,我覺得引用文章中的理論應該是有道理的,所下面次再遇到此異常,最好還是試試將有關配置參數減少,沒準會解決這個問題。

解決 - java.lang.OutOfMemoryError: unable to create new native thread

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.