Java内存溢出即程序在申请内存时,没有足够的空间供其使用,出现out of memory。常见于四种情况:栈溢出(StackOverflowError)、堆溢出(OutOfMemoryError:java heap space)、永久代溢出(OutOfMemoryError: PermGen space)、OutOfMemoryError:unable to create native thread,以下一一进行总结。

1、栈溢出

首先搞清楚java栈空间存储的是什么。java栈空间是线程私有的,是java方法执行的内存模型。每个方法执行时都会在java栈空间产生一个栈帧,存放方法的变量表,返回值等信息,方法的执行到结束就是一个栈帧入栈到出栈的过程。

所以栈溢出的原因一般是循环调用方法导致栈帧不断增多,栈深度不断增加,最终没有内存可以分配,出现StackOverflowError,比如下面这种情况:

public class stack{public void test(){this.test();}public static void main(String[] args){for(; ; ;)new stack().test;}
}

栈内存溢出一般是程序错误导致,如递归死循环等等。

2、堆溢出

java堆是线程共有的区域,主要用来存放对象实例,几乎所有的java对象都在这里分配内存,也是JVM内存管理最大的区域。java堆内存分年轻代和年老代,堆内存溢出一般是年老代溢出。当程序不断地创建大量对象实例并且没有被GC回收时,就容易产生内存溢出。当一个对象产生时,主要过程是这样的:

JVM首先在年轻代的Eden区为它分配内存;

若分配成功,则结束,否则JVM会触发一次Young GC,试图释放Eden区的不活跃对象;

如果释放后还没有足够的内存空间,则将Eden区部分活跃对象转移到Suvivor区,Suvivor区长期存活的对象会被转移到老年代;

当老年代空间不够,会触发Full GC,对年老代进行完全的垃圾回收;

回收后如果Suvivor和老年代仍没有充足的空间接收从Eden复制过来的对象,使得Eden区无法为新产生的对象分配内存,即溢出。

由此可见,当程序不断地创建大量对象实例并且没有被GC回收时,就容易产生内存溢出。如下:

public class heap{public static void main(String[] args){ArrayList list = new ArrayList();while(true){list.add(new heap());}}
}

堆内存溢出很可能伴随内存泄漏,应首先排查可能泄露的对象,再通过工具检查GC roots引用链,从而发现泄露对象是由于何种引用关系使得GC无法回收他们;若不存在内存泄漏,换句话说就是内存中的对象还都需要继续存活,则可通过修改虚拟机的堆参数将堆内存增大。

3、永久代溢出

永久代也是java堆内存的一部分,主要用来存放Class的相关信息,如类名,访问修饰符等等。一般永久代溢出的原因是动态加载大量的Class并且没有及时被GC回收。只能通过调整永久代内存参数的方式解决。

4、无法创建本地线程

我们知道,操作系统对每个进程的内存都是有一定限制的,当堆内存和非堆内存分配过大时,剩余的内存不足以创建足够的线程栈,就会产生OutOfMemoryError。因此我们可以增大进程占用的总内存或减小堆内存等来解决问题。

总结:

  • 栈内存溢出:程序所要求的栈深度过大导致。
  • 堆内存溢出: 分清 内存泄露还是 内存容量不足。泄露则看对象如何被 GC Root 引用。不足则通过 调大 -Xms,-Xmx参数。
  • 持久带内存溢出:Class对象未被释放,Class对象占用信息过多,有过多的Class对象。
  • 无法创建本地线程:总容量不变,堆内存,非堆内存设置过大,会导致能给线程的内存不足。

参考博客:

https://blog.csdn.net/u014131893/article/details/22474881

https://blog.csdn.net/ni357103403/article/details/51940884/

Java内存溢出场景及解决办法相关推荐

  1. springboot上传大文件时内存溢出的可能解决办法

    springboot上传大文件时内存溢出的可能解决办法 在springboot中上传大文件时要考虑内存的情况,一般我们会通过在执行服务时加入-Xms512m -Xmx512m等参数加大堆内存,但这是指 ...

  2. java内存溢出原因及解决_java内存溢出的原因和解决方法

    java内存溢出的原因和解决方法 发布时间:2020-06-15 17:57:39 来源:亿速云 阅读:85 作者:元一 内存溢出含义: 内存溢出(out of memory)通俗理解就是内存不够,通 ...

  3. java内存溢出的情况解决方法

    内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决. 第一步,就是修改JVM启动参数,直接增加内存.这一点看上去似乎很简单,但很容易被忽略.JVM默认可以使用的内存为64M,To ...

  4. C#程序出现内存溢出错误的解决办法

    上周一个C#开发的站点出现了内存溢出错误:"引发类型为"System.OutOfMemoryException"的异常" 因为页面众多一时最初难以确定问题源,找 ...

  5. java 内存 溢出_java内存溢出的几种原因和解决办法是什么?

    java内存溢出的几种原因和解决办法是什么? java内存溢出的几种原因和解决办法是: 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出: 那什么样的情况就是堆栈溢出呢?当你看 ...

  6. Java内存溢出问题解决办法

    Java内存溢出是常见问题,现介绍内存溢出问题的几种解决办法,不仅适用于TongWeb,也适用所有的Java程序.问题具体原因就不再解释了,对于初学者先知道大概解决办法就行了.本文只是举例常见解决办法 ...

  7. java 二维数组内存溢出_模拟Java内存溢出

    本文通过修改虚拟机启动参数,来剖析常见的java内存溢出异常(基于jdk1.8). 修改虚拟机启动参数 这里我们使用的是IDEA集成开发环境,选择Run/Debug Configurations 然后 ...

  8. Java内存溢出分析

    内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题.内存溢出与锁表则不然,一 ...

  9. Java基础学习总结(30)——Java 内存溢出问题总结

    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各 ...

最新文章

  1. 使用页面元素属性做状态判断的隐患
  2. 04封装 里氏转换 多态
  3. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)
  4. c语言全局变量和局部变量问题汇总
  5. pHp30充电宝能用快充吗,65W快充 30分钟充满电 是时候淘汰充电宝了吗?
  6. 服务器通电显示黄灯,服务器内存亮黄灯
  7. 旷视周而进:人脸识别简史与距离对齐技术的应用
  8. NIOS2按键中断与ISR写法
  9. 大家一起来谈论C#的前途
  10. 代码整洁之道-编写 Pythonic 代码
  11. 关于vs2015各版本的卸载
  12. [CSCCTF 2019 Qual]FlaskLight
  13. 怎么给领导做项目汇报
  14. [WC2008]游览计划
  15. 电阻介绍及工作原理应用
  16. C++ - CString 用法
  17. PLS-00103: 出现符号 在需要下列之一时 ( ; is with oracle利用存储过程设计定时器的问题
  18. C#练习题答案: 图片#1 - 重建巴别塔【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  19. 统计学中数据分析方法汇总
  20. 分享23种追女生的方式,教你同时把追MM和设计模式融汇贯通(上

热门文章

  1. 圣诞节高清Mac动态壁纸
  2. 高中优质计算机课ppt课件ppt课件ppt课件ppt课件ppt课件,高中数学课一等奖课件.ppt...
  3. Bootstrap4使用Bootstrap-table时不显示图标
  4. VC++6.0实现快捷菜单
  5. scara机器人dh参数表_工业机器人九大选型参数
  6. 店铺补单,补单技巧,补单流程及注意事项,降低被抓率
  7. 使用bootstrap进行表格布局,文字垂直居中
  8. python 全栈开发,Day103(微信消息推送,结算中心业务流程)
  9. 高性能Go语言日志模块dlog使用说明
  10. steam离线使用skycity模组