模拟JAVA堆内存溢出和栈内存溢出
文章目錄
- 1. 模擬堆內存溢出
- 2. 模擬棧內存溢出
1. 模擬堆內存溢出
為了更快的出現堆內存溢出,可以限制Java堆的大小為10MB(不限制也可以)。代碼如下(可直接復制使用):
package test.oom;import java.util.ArrayList; import java.util.List;// VM Args:-Xms10m -Xmx10m public class HeapOOM {static class OOMObject {}public static void main(String[] args) {List<OOMObject> list = new ArrayList<>();while (true) {list.add(new OOMObject());}} }運行結果:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.base/java.util.Arrays.copyOf(Arrays.java:3511)at java.base/java.util.Arrays.copyOf(Arrays.java:3480)at java.base/java.util.ArrayList.grow(ArrayList.java:237)at java.base/java.util.ArrayList.grow(ArrayList.java:244)at java.base/java.util.ArrayList.add(ArrayList.java:454)at java.base/java.util.ArrayList.add(ArrayList.java:467)at test.oom.HeapOOM.main(HeapOOM.java:14)Process finished with exit code 1當申請不到堆內存,總容量觸及最大堆的容量限制后就會產生堆內存溢出異常。Java堆內存的OutOfMemoryError異常是實際應用中最常見的內存溢出異常情況。出現Java堆內存 溢出時,異常堆棧信息“java.lang.OutOfMemoryError”會跟隨進一步提示“Java heap space”。
要解決這個內存區域的異常,常規的處理方法是首先通過內存映像分析工具(如Eclipse Memory Analyzer)對Dump出來的堆轉儲快照進行分析。首先應確認內存中導致OOM的對象是否是必要的,也就是要先分清楚到底是出現了內存泄漏(Memory Leak)還是內存溢出(Memory Overflow)。如果是內存溢出且代碼沒問題,就需要擴大堆內存;如果是內存泄漏一般需要查看自己代碼。
2. 模擬棧內存溢出
模擬棧內存溢出,可以參考如下代碼(可直接復制使用):
package test.oom;public class StackOOM {private int stackLength = 1;public void stackLeak() {stackLength++;stackLeak();}public static void main(String[] args) throws Throwable {StackOOM oom = new StackOOM();try {oom.stackLeak();} catch (Throwable e) {System.out.println("stack length:" + oom.stackLength);throw e;}} }運行結果:
stack length:16073(機器和配置不同,這個值會不同) Exception in thread "main" java.lang.StackOverflowErrorat test.oom.StackOOM.stackLeak(StackOOM.java:8)at test.oom.StackOOM.stackLeak(StackOOM.java:8)......(省略了相同的日志)at test.oom.StackOOM.stackLeak(StackOOM.java:8)at test.oom.StackOOM.stackLeak(StackOOM.java:8)Process finished with exit code 1可以看到出現了StackOverflowError,關于虛擬機棧和本地方法棧,在《Java虛擬機規范》中描述了兩種異常:
2.1 如果線程請求的棧深度大于虛擬機所允許的最大深度,將拋出StackOverflowError異常。
2.2 如果虛擬機的棧內存允許動態擴展,當擴展棧容量無法申請到足夠的內存時,將拋出 OutOfMemoryError異常。
這個例子是棧深度大于虛擬機所允許的最大深度,方法執行是利用棧來實現的。
總結
以上是生活随笔為你收集整理的模拟JAVA堆内存溢出和栈内存溢出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: B端产品如何搭建用户帮助体系
- 下一篇: slice和splice数组的截取/sp