OutOfMemoryError/OOM/內存溢出異常實例分析--堆內存異常
阿新 • • 發佈:2018-10-25
imp 分析工具 util jvm 內存映像 圖片 工具 操作 最大
Java堆內存溢出
只要不斷創建對象,並且保證GC Roots到對象之間有可達路徑來避免垃圾回收機制清除這些對象,
那麽在對象數量到達最大堆的容量限制後就會產生內存溢出異常,代碼如下:
import java.util.ArrayList; import java.util.List; public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject> list = new ArrayList<>();while (true) { list.add(new OOMObject()); } } }
在運行的時候,需要設置一下Java堆的大小,並且不可擴展,操作如下:
然後填寫JVM啟動參數:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
限制Java堆大小20m,最大值和最小值一致就達到不可擴展的目的了,-XX:+HeapDumpOnOutOfMemoryError參數可以讓虛擬機在出現
內存溢出異常時Dump出當前的內存轉儲快照以便事後分析。(感興趣的可以使用內存映像分析工具Eclipse Memory Analyzer打開堆轉儲快照文件進行分析)
運行結果如下:
OutOfMemoryError/OOM/內存溢出異常實例分析--堆內存異常