四面阿里Java开发岗,Java内存溢出异常(上

  1. 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

  2. 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

这种分类不是很清楚,因为太少的内存或太多的堆栈空间会导致堆栈空间无法继续分配。

堆栈溢出错误是一个简单的条件。堆栈溢出错误是以下简单代码中的堆栈溢出:堆栈溢出错误、堆栈溢出错误、堆栈溢出错误、堆栈溢出错误、堆栈溢出错误、堆栈溢出错误、堆栈溢出错误


 public class JavaVMStackSOF {

    private int stackLength = 1;



    public void stackLeak() {

        stackLength++;

        stackLeak();

    }



    public static void main(String[] args) {

        JavaVMStackSOF javaVMStackSOF = new JavaVMStackSOF();

        try {

            javaVMStackSOF.stackLeak();

        } catch (Throwable e) {

            System.out.println("Stack length:" + javaVMStackSOF.stackLength);

            throw e;

        }

    }

}

运行结果如下:


Stack length:18663

Exception in thread "main" java.lang.StackOverflowError

	at cn.bdqfork.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)

	at cn.bdqfork.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)

	at cn.bdqfork.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)

	at cn.bdqfork.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12)

    ......

对于上述结果,不同计算机的堆栈长度大小是不确定的。从输出异常信息来看,这是因为stackleak方法具有太多的递归调用层。在大多数情况下,在虚拟机的默认参数下,堆栈深度足够。

OutofMemoryError异常相对比较难发生,通常在多线程环境中。创建线程时,虚拟机会会将私有堆栈空间分配给相应的线程,该线程的大小可以用-xss参数设置。通过不断地创建新进程,可以生成内存溢出异常。

原因是当一个进程运行时,操作系统分配给该进程的内存是有限的。Java堆和方法区域占大多数内存,忽略程序计数器占用的一小部分内存,而不计算虚拟机本身占用的内存,其余部分由虚拟机栈和本地方法栈占据。因此,当创建的线程数达到一定水平时,虚拟机堆栈和本地方法堆栈占用的空间会使进程的内存空间不足,从而抛出内存溢出异常。

这部分的测试代码如下:


 public class JavaVMStackOOM {

    private void dontStop() {

        while (true) {

            

        }

    }



    public void stackLeakByThread() {

        while (true) {

            Thread thread = new Thread(new Runnable() {

                @Override

                public void run() {

                    dontStop();

                }

            });

            thread.start();

        }

    }
# **学习分享,共勉**

这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,**囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!**

> **资料都是免费提供的,整理不易,有需要的朋友可以转发分享下,同时可以关注我,定期分享学习资源还会更新一些技术分享!**

**[资料免费领取:点击这里即可免费获取!](https://gitee.com/vip204888/java-p7)**

**整理不易,有需要的朋友转发支持下,感谢感谢!**

**Java核心知识体系笔记.pdf**

![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/1c2829bb4fa84c1ef8a491819b0cbae5.png)

**中高级Java开发面试高频考点题笔记300道.pdf**

![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/56448f56233178ca7d21ed882241abf3.png)

**架构进阶面试专题及架构学习笔记脑图**

![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/8bb586e7340b8150568aae912dbbcbb9.png)

**Java架构进阶学习视频分享**

![记一次蚂蚁金服Java研发岗的面试经历,分享下我的复习笔记面经](https://img-blog.csdnimg.cn/img_convert/f070c132982b4d1ca8a5523fc821203c.png)

uJmSZ-1628089500996)]

**架构进阶面试专题及架构学习笔记脑图**

[外链图片转存中...(img-8znZftOi-1628089500997)]

**Java架构进阶学习视频分享**

[外链图片转存中...(img-lpV3N1h7-1628089500999)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值