前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OutOfMemoryError异常

OutOfMemoryError异常

作者头像
吉林乌拉
发布2019-08-14 17:46:42
3680
发布2019-08-14 17:46:42
举报
文章被收录于专栏:吉林乌拉吉林乌拉

我们知道在Java虚拟机内存中,除了程序计数器外,其它的内存区域都可能会发生OutOfMemoryError异常。本文将用具体的事例来演示在什么情况下会出现OutOfMemoryError异常,并以此来演示一下相关的虚拟机参数。

  • 堆溢出

我们知道Java堆是用来存储对象实例的,只要我们不断的创建对象,并保证它们不被Java垃圾回收器回收,当存储的对象数量超过Java堆中最大的容量时,就会抛出OutOfMemoryError异常。在Java虚拟机中可以用-Xms参数和-Xmx参数设置Java堆的容量大小。

-Xms // 设置堆的最小值 -Xmx // 设置堆的最大值 当-Xms和-Xmx参数不一致时,如果存储的对象超过-Xms时,Java堆将进行自动扩展。下面我们将-Xms和-Xmx设置为一致,以避免Java堆的自动扩展,方便我们演示Java堆的溢出。

  • 栈溢出

栈的容量由参数-Xss设置。在Java栈中有两种情况可能会抛出异常

  1. 如果线程请求栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常
  2. 如果虚拟机在扩展栈时无法获得足够的内存空间时,则抛出OutOfMemoryError异常。

下面我们通过两个例子来演示上述的异常情况。

由此可见,在单线程的情况下,无论栈的大小是多少,当内存无法分配时,虚拟机都会抛出StackOverflowError异常。那如何才能抛出OutOfMemoryError异常呢?我们先看下面的例子,然后我们在做详细解释。

上述的代码不但会抛出OutOfMemoryError异常,还会导致系统卡死,所以要慎重执行上面代码。那为什么重复创建线程就会导致虚拟机栈内存的溢出呢?这是因为在其它文章中我们已经介绍过了,线程都有自己的独立内存空间,并且每个线程的内存空间大小是有限制的,如果创建的线程空间大小超过了系统内存时,如果继续创建线程,虚拟机无法为栈分配空间了,所以就会抛出OutOfMemoryError异常。

  • 方法区和运行时常量池

我们可以用下面的参数来设置方法区的大小

代码语言:javascript
复制
-XX:PermSize // 方法区设置的最小值
-XX:MaxPermSize // 方法区设置的最大值
  • 本机直接内存溢出

我们可以用下面参数指定本机容量,如果不设置默认与堆的最大值一样。

代码语言:javascript
复制
-XX:MaxDirectMemorySize
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吉林乌拉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档