內存溢出和內存泄漏是什么,是怎么發生的的呢?內存溢出和內存泄漏它們的區別是什么?應該怎么做防護措施呢?小編接介紹一下吧。
內存溢出和內存泄漏是什么,是怎么發生的的呢?內存溢出和內存泄漏它們的區別是什么?應該怎么做防護措施呢?小編接介紹一下吧。
內存溢出和內存泄漏有什么區別:
內存泄漏是由于使用不當,把一部分內存“丟掉了”,導致這部分內存不可用。
當在堆中創建了對象,后來沒有使用這個對象了,又沒有把整個對象的相關引用設為null。此時垃圾收集器會認為這個對象是需要的,就不會清理這部分內存。這就會導致這部分內存不可用。
所以內存泄漏會導致可用的內存減少,進而會導致內存溢出。
內存泄露問題排查方法:
用visualVM工具分析堆快照 ,如果發生內存泄漏:
step1:找出泄漏的對象
step2:找到泄漏對象的GC Root
step3:根據泄漏對象和GC Root找到導致內存泄漏的代碼
step4:想法設法解除泄漏對象與GCRoot的連接
如果不存在泄漏:
看下是否能增大jvm堆的最大容量,優化程序,減小對象的生命周期
前期準備:
當發生堆溢出的時候,可以讓程序在崩潰時產生一份堆內存快照
產生堆內存快照的方法:
給jvm加上參數XX:+HeapDumpOnOutofMemoryError,這樣就會在程序崩潰的時候,產生一份堆內存快照
分析堆內存快照我建議用jdk自帶的可視化監視工具visualVM,位置在jdk安裝目錄下的bin,如果是在Linux環境的話,可以把快照傳到window。因為分析工具會占用很大的內存,不建議在服務端進行分析。
解決方法:
針對StackOverflowError:
1.首先棧溢出會輸出異常信息,根據信息查看對應的方法調用是否出現無限調用、或者棧幀過大等代碼邏輯上的問題,通過修改代碼邏輯解決;
2.如果確確實實需要更大的棧容量,可以檢查并調大棧容量:-Xss16m。
內存泄露的跡象:老年代每次垃圾回收的時候,總是不能全部回收,一次比一次占用的內存多。
針對OutOfMemoryError:
首先檢查是否創建過多的線程,減少線程數
有了堆信息查看方面的功能,我們一般可以順利解決以下問題:
--年老代年輕代大小劃分是否合理
--內存泄漏
--垃圾回收算法設置是否合理
內存泄漏的現象:
常常地,程序內存泄漏的最初跡象發生在出錯之后,在你的程序中得到一個OutOfMemoryError。
這種典型的情況發生在產品環境中,而在那里,你希望內存泄漏盡可能的少,調試的可能性也達到最小。
一個OutOfMemoryError常常是內存泄漏的一個標志,有可能應用程序的確用了太多的內存;這個時候,你既不能增加JVM的堆的數量,也不能改變你的程序而使得他減少內存使用。
但是,在大多數情況下,一個OutOfMemoryError是內存泄漏的標志。一個解決辦法就是繼續監聽GC的活動,看看隨時間的流逝,內存使用量是否會增加,如果有,程序中一定存在內存泄漏。
<div>上一篇:java 虛擬機10:類加載器
下一篇:什么是Java虛擬機
免責聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發現本社區中有涉嫌抄襲的內容,請發送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。