专栏首页空帆船wJVM 中的内存溢出

JVM 中的内存溢出

内存溢出,通俗一点,就是 JVM 内存不足了,没有空闲内存,并且垃圾收集器也无法提供更多内存。

这里的意思是说,通常在抛出 OutOfMemoryError 之前,垃圾收集器会被触发,尽其所能去清理空间。

但也不是在所有情况下垃圾回收器都会被触发,比如分配了一个大对象,超过了堆的最大值,JVM 可能判断出垃圾收集并不能解决这个问题,直接抛出 OutOfMemoryError 。

JVM 内存结构 中,除了程序计数器,其他区域都有可能发生 OutOfMemoryError 。

1、堆溢出

通过-XmsXmx分别设定堆最小值和最大值。

错误信息:

java.lang.OutOfMemoryError: Java heap space

可能原因:

  • 内存泄漏
  • 堆的大小不合理,比如处理可观的数据量,但是没有显示指定 JVM 堆大小或者指定数值太小
  • JVM 处理引用不及时,导致堆积起来,内存无法释放

2、栈溢出

通过 --Xss 设置栈容量大小。

这里的栈包括虚拟机栈和本地方法栈。

比如递归操作,没有退出条件,会导致不断的压栈,JVM 就会抛出 StackOverFlowError。

如果 JVM 试图去扩展栈空间的时候失败,则会抛出 OutOfMemoryError。

3、方法区溢出

通过 -XX:PermSize-XX:MaxPermSize 限制方法区的大小。

String.intern() 的作用是:如果字符串常量池中已经包含一个等于此 String对象的字符串,则返回代表池中这个字符串的 String 对象,否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用。所以,当字符串缓存占用太多空间,也会导致 OOM 问题。

错误信息:

java.lang.OutOfMemoryError: PermGen space

JDK 1.7 后,方法区引入元数据区,元数据区默认自增,方法区内存不再那么窘迫。

元数据区错误信息:

java.lang.OutOfMemoryError: Metaspace

4、直接内存溢出

通过 -XX:MaxDirectMemorySize 指定直接直接内存容量大小。

特征:

Heap Dump 文件中不会看见明显的异常,如果 Dump 文件很小,程序中有使用 NIO,可以考虑检查是否是直接内存溢出。

本文分享自微信公众号 - JaqenTalk(gh_a27e6529b76c)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JVM 中的内存溢出

    内存溢出,通俗一点,就是 JVM 内存不足了,没有空闲内存,并且垃圾收集器也无法提供更多内存。

    用户3596197
  • Java 中 String 类为什么要设计成不可变的?

    String 是 Java 中不可变的类,所以一旦被实例化就无法修改。不可变类的实例一旦创建,其成员变量的值就不能被修改。本文总结下 String 类设计成不可...

    用户3596197
  • 我的公众号文章是如何排版的?

    文字排版是一篇文章展现给读者的第一印象,不知道大家怎么看,反正我每次看到排版错乱的文章,往下读的兴趣直接减少了一半。

    用户3596197
  • JVM 中的内存溢出

    内存溢出,通俗一点,就是 JVM 内存不足了,没有空闲内存,并且垃圾收集器也无法提供更多内存。

    用户3596197
  • 面试常备,字符串三剑客 String、StringBuffer、StringBuilder

    字符串操作毫无疑问是计算机程序设计中最常见的行为之一,在 Java 大展拳脚的 Web 系统中更是如此。

    飞天小牛肉
  • 使用Pinyin4j进行拼音分词

    allsmallpig
  • C++实现一个简单的String类

    使用基本的C++知识实现一个简单的String类,这个类中包含了C++常用的知识点。感觉是很有意思的一个小代码片段。

    卡尔曼和玻尔兹曼谁曼
  • 说说Python中字符串大小写转换?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一...

    程序IT圈
  • 无锁队列的实现

    关于无锁队列的实现,网上有很多文章,虽然本文可能和那些文章有所重复,但是我还是想以我自己的方式把这些文章中的重要的知识点串起来和大家讲一讲这个技术。下面开始正文...

    Linux阅码场
  • 面试题25(将this is a test 转化为This Is A Test)

    将this is a test 转化为This Is A Test public class Demon{ public static void main(S...

    Java学习

扫码关注云+社区

领取腾讯云代金券