龙空技术网

JVM面试题:代码实现堆溢出和栈溢出

面试题解析 92

前言:

现时大家对“栈溢出是什么意思”大体比较珍视,咱们都想要学习一些“栈溢出是什么意思”的相关资讯。那么小编也在网上搜集了一些有关“栈溢出是什么意思””的相关资讯,希望兄弟们能喜欢,朋友们快快来学习一下吧!

1 堆溢出

Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。

代码实现如下:

import java.nio.ByteBuffer;import java.util.ArrayList;import java.util.List;public class OOMTest {    public static void main(String[] args) {        final int one = 1024 * 1024 * 1;        List<ByteBuffer> buffers = new ArrayList<>();        while (true){            ByteBuffer byteBuffer = ByteBuffer.allocateDirect(one);            buffers.add(byteBuffer);        }    }}
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory	at java.nio.Bits.reserveMemory(Bits.java:693)	at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)	at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)	at OOMTest.main(OOMTest.java:9)
2 栈溢出

栈容量只由-Xss参数设置,在Java虚拟规范中描述的异常有两种:一是如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常;二是如果虚拟机在扩展栈时无法申请到足够的内存空间,将抛出OutOfMemoryError异常。

代码实现如下:

public class StackSOFTest {    private int stackLength=1;    public void stackLeak(){        stackLength++;        stackLeak();    }    public static void main(String[] args) {        StackSOFTest test = new StackSOFTest();        test.stackLeak();    }}
Exception in thread "main" java.lang.StackOverflowError	at StackSOFTest.stackLeak(StackSOFTest.java:5)	at StackSOFTest.stackLeak(StackSOFTest.java:5)	at StackSOFTest.stackLeak(StackSOFTest.java:5)	at StackSOFTest.stackLeak(StackSOFTest.java:5)	at StackSOFTest.stackLeak(StackSOFTest.java:5)	at StackSOFTest.stackLeak(StackSOFTest.java:5)	at StackSOFTest.stackLeak(StackSOFTest.java:5)	at StackSOFTest.stackLeak(StackSOFTest.java:5)

【温馨提示】

点赞+收藏文章,关注我并私信回复【面试题解析】,即可100%免费领取楼主的所有面试题资料!

标签: #栈溢出是什么意思