今天是周末,祝大家周末愉快,11月3日更新了極限挑戰,看的我是感觸良多,心中還是澎湃的不行。看到時光的飛逝,讓人更加的感受到,這就是生活。所以也希望大家能夠通過總結之后珍惜良多的時光,我也盡量把知識點濃縮一下。
今天我們就聊聊Java中最經常出現的OOM異常——OutOfMemoryError。
OutOfMemoryError異常情況
除了程序計數器外,虛擬機內存的其他幾個運行時區域都有發生OutOfMemoryError(OOM)異常的可能。
Java堆溢出
Java堆用于存儲對象實例,只要不斷地創建對象,并且保證GC Roots到對象之間有可達路徑來避免垃圾回收機制清除這些對象,那么在對象數量到達最大堆的容量限制后悔產生內存溢出異常。
堆最小值-Xms和堆最大值-Xmx設置一樣可以避免堆自動擴展。
虛擬機棧和本地方法棧溢出
-Xoss參數在Hotspot是無效的(設置本地方法棧大小),棧容量只由-Xss參數設定。
如果線程請求的棧深度大于虛擬機所允許的最大深度,將拋出StackOverFlowError異常。
如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常。
在單線程下,無論是由棧幀太大還是虛擬機棧容量太小,當內存無法分配的時候,虛擬機拋出的都是StackOverFlowError異常。
棧深度在大多數情況下達到1000-2000完全沒有問題。但是如果建立過多的線程導致的內存溢出,在不能減少線程數或者更換64位虛擬機的情況下,就只能減少最大堆和減少棧容量來換取更多的線程。
方法區和運行時常量池溢出
-XX:PermSize和-XX:MaxPermSize限制方法區大小,從而間接限制其中常量池的容量。
本機直接內存溢出
直接內存容量可以通過-XX:MaxDirectMemorySize制定,如果不指定,則默認與Java堆最大值(-Xmx)一樣。
直接內存導致的的內存溢出的一個明顯的特征是HeapDump文件中不會看到明顯的異常。
今天的篇幅比較精簡。我們其實只要記住這些。在生活中排查問題的時候會有很多的幫助。也可以節約一些時間。用于更璀璨的生活中。
我的文章每天都會在頭條號首發,然后第二天轉發到簡書中,希望有興趣的朋友可以關注我的頭條號:[Bug制造機]
(https://www.toutiao.com/c/user/51553105950/#mid=1582105392193550)。謝謝大家的支持。