盘点java内存溢出的2种情况

转自:微点阅读   https://www.weidianyuedu.com

java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少。

进过自己一番总结内存溢出主要分为2种:

一、堆内存溢出 OutOfMemoryError

从jvm的角度看发生的情况是:  1、动态扩展的栈内存无法满足内存分配。  2、建立新的线程没有足够内存创建栈。

从编码角度看发生的情况是:  1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;  2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;  3、代码中存在死循环或循环产生过多重复的对象实体;  4、使用的第三方软件中的BUG;  5、启动参数内存值设定的过小;

解决方案:  1、检查代码中是否存在一次性取出大量数据  2、检查循环体、递归调用中是否有大量导致gc无法回收的对象  3、-Xms -Xmx 配置最大最小堆内存大小,默认 -Xms256m -Xmx512m

示例:

/**

堆内存溢出

*/

private static void OutOfMemoryErrorExample() {    List<String> list = new ArrayList<>();    String str = "";    while (true) {        str += new Date().toString();        list.add(str);    }}

二、线程jvm栈内存溢出 StackOverflowError

从jvm的角度看发生的情况是:方法执行时申请不到新的空间存储(局部变量表, 操作数栈 , 动态链接 , 方法出口信息)。

从编码角度看发生的情况是:一般出现在递归和循环依赖调用的代码块中

解决方案:1、检查递归和循环依赖调用的代码块,尽可能严谨。2、-Xss 通过这个参数配置默认的jvm栈大小,这个标识即可以通过项目的配置也可以通过命令行来指定,默认 -Xss1m 或者 -Xss0.5m。

示例:

/**

栈内存溢出

*/

private static void StackOverflowErrorExample(int index) {    if (index != 0) {        StackOverflowErrorExample(++index);    }}

总结:一般来说,方法在调用时发生的内存不足 会抛StackOverflowError ,发生在方法执行过程中的内存不足会抛 OutOfMemoryError

StackOverflowError(方法调用层次太深,内存不够新建栈帧)

OutOfMemoryError(线程太多,内存不够新建线程)

模拟内存溢出的时候可以设置jvm的启动参数,设置小点的内存量,让它尽快达到内存溢出的效果

如: -Xmx64m -Xms32m -Xmn16m -Xss8m

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值