Java内存溢出场景及解决办法
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内存溢出场景及解决办法相关推荐
- springboot上传大文件时内存溢出的可能解决办法
springboot上传大文件时内存溢出的可能解决办法 在springboot中上传大文件时要考虑内存的情况,一般我们会通过在执行服务时加入-Xms512m -Xmx512m等参数加大堆内存,但这是指 ...
- java内存溢出原因及解决_java内存溢出的原因和解决方法
java内存溢出的原因和解决方法 发布时间:2020-06-15 17:57:39 来源:亿速云 阅读:85 作者:元一 内存溢出含义: 内存溢出(out of memory)通俗理解就是内存不够,通 ...
- java内存溢出的情况解决方法
内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决. 第一步,就是修改JVM启动参数,直接增加内存.这一点看上去似乎很简单,但很容易被忽略.JVM默认可以使用的内存为64M,To ...
- C#程序出现内存溢出错误的解决办法
上周一个C#开发的站点出现了内存溢出错误:"引发类型为"System.OutOfMemoryException"的异常" 因为页面众多一时最初难以确定问题源,找 ...
- java 内存 溢出_java内存溢出的几种原因和解决办法是什么?
java内存溢出的几种原因和解决办法是什么? java内存溢出的几种原因和解决办法是: 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出: 那什么样的情况就是堆栈溢出呢?当你看 ...
- Java内存溢出问题解决办法
Java内存溢出是常见问题,现介绍内存溢出问题的几种解决办法,不仅适用于TongWeb,也适用所有的Java程序.问题具体原因就不再解释了,对于初学者先知道大概解决办法就行了.本文只是举例常见解决办法 ...
- java 二维数组内存溢出_模拟Java内存溢出
本文通过修改虚拟机启动参数,来剖析常见的java内存溢出异常(基于jdk1.8). 修改虚拟机启动参数 这里我们使用的是IDEA集成开发环境,选择Run/Debug Configurations 然后 ...
- Java内存溢出分析
内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题.内存溢出与锁表则不然,一 ...
- Java基础学习总结(30)——Java 内存溢出问题总结
Java中OutOfMemoryError(内存溢出)的三种情况及解决办法 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各 ...
最新文章
- 使用页面元素属性做状态判断的隐患
- 04封装 里氏转换 多态
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)
- c语言全局变量和局部变量问题汇总
- pHp30充电宝能用快充吗,65W快充 30分钟充满电 是时候淘汰充电宝了吗?
- 服务器通电显示黄灯,服务器内存亮黄灯
- 旷视周而进:人脸识别简史与距离对齐技术的应用
- NIOS2按键中断与ISR写法
- 大家一起来谈论C#的前途
- 代码整洁之道-编写 Pythonic 代码
- 关于vs2015各版本的卸载
- [CSCCTF 2019 Qual]FlaskLight
- 怎么给领导做项目汇报
- [WC2008]游览计划
- 电阻介绍及工作原理应用
- C++ - CString 用法
- PLS-00103: 出现符号 在需要下列之一时 ( ; is with oracle利用存储过程设计定时器的问题
- C#练习题答案: 图片#1 - 重建巴别塔【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
- 统计学中数据分析方法汇总
- 分享23种追女生的方式,教你同时把追MM和设计模式融汇贯通(上
热门文章
- 圣诞节高清Mac动态壁纸
- 高中优质计算机课ppt课件ppt课件ppt课件ppt课件ppt课件,高中数学课一等奖课件.ppt...
- Bootstrap4使用Bootstrap-table时不显示图标
- VC++6.0实现快捷菜单
- scara机器人dh参数表_工业机器人九大选型参数
- 店铺补单,补单技巧,补单流程及注意事项,降低被抓率
- 使用bootstrap进行表格布局,文字垂直居中
- python 全栈开发,Day103(微信消息推送,结算中心业务流程)
- 高性能Go语言日志模块dlog使用说明
- steam离线使用skycity模组