圆圆网络 手游攻略 手游评测 内存溢出的原因及解决办法(4大主流解决方案详解)

内存溢出的原因及解决办法(4大主流解决方案详解)

时间:2024-09-24 11:14:56 来源:网络整理 浏览:0

内存溢出(OOM)是网上经常遇到的问题,也是各大厂商面试时经常考察的问题。下面我详细解释一下内存溢出(OOM)的原因和解决办法@mikechen

内存溢出

内存溢出,简称OOM,内存溢出是指你请求分配的内存超过了系统能给你的,系统无法满足需求,所以发生了溢出。

比如你申请了一个整数,但是存储了一个只能用long存储的数字,那就是内存溢出。

另一个例子:你的电脑只有16GB内存。如果你已经用完16GB内存,但继续使用,就会导致内存溢出。

内存溢出的原因

1.程序常见的内存溢出原因

启动参数内存值设置太小。内存加载的数据量太大;对象引用使用后没有清除,导致JVM无法回收;代码中存在无限循环或循环生成太多重复项。对象实体;

2.Web服务器常见内存溢出提示

在不同的Web服务器或程序中,该错误的常见错误提示如下:

内存溢出的原因及解决办法(4大主流解决方案详解)

tomcat: java.lang.OutOfMemoryError: PermGen spacetomcat: java.lang.OutOfMemoryError: Java 堆空间weblogic: ServletException 的根本原因java.lang.OutOfMemoryErrorresin: java.lang.OutOfMemoryErrorjava: java.lang.OutOfMemoryError 这些是典型的内存溢出。我们来看一下。具体内存溢出的解决办法。

内存溢出的解决办法

这里我以Java为例。常见的Java内存溢出主要有以下三种方式:

1.堆溢出

这是一种非常常见的内存溢出。错误信息如下:

java.lang.OutOfMemoryError: Java堆空间给出了无限循环的示例。源码如下:

package com.mikechen.jvm;/** * JVM内存溢出案例详解* * @author mikechen * */import java.util.ArrayList;import java.util.List;public class MemoryOOM { static class Obj{ }/** * -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * */public static void main(String[] args) { ListObj list=new ArrayList();尝试{ while (true){ list.add(new Obj()); } } catch (Throwable t){ t.printStackTrace(); System.out.println('设置大小'+list.size());会出现死循环list.add(new Obj()),不断创建对象时,当总容量达到最大堆容量时,就会发生溢出,出现如下提示:

解决方案:

1.首先检查,检查是否有大对象分配,很有可能是大对象分配。 2、其次,使用jmap命令转储堆内存,并使用mat工具进行分析,检查是否存在内存泄漏问题。 3.如果没有发现明显的内存泄漏,可以适当调整-Xms和-Xmx JVM参数。

内存溢出的原因及解决办法(4大主流解决方案详解)

比如上面的例子,通过第二步中的堆转储,可以利用工具分析死循环的位置,就可以及时解决堆溢出问题。

如果通过上面两个步骤检查没有发现问题,再调整JVM堆的初始化参数,问题就基本可以解决了。

2.堆内存溢出

首先,弄清楚Java堆栈空间中存储了什么。栈内存可以分为虚拟机栈(VM Stack)和本机方法栈(Native Method Stack)。

每个方法执行时,都会在Java栈空间中生成一个栈帧,其中存储了该方法的变量表、返回值等信息。方法的执行到最后是一个从栈帧到栈帧的过程。

具体来说,当一个线程执行一个方法时,JVM会创建一个栈帧并将其压入栈中。此时,刚刚入栈的栈帧就成为当前栈帧。

如果递归调用该方法,JVM每次都会将保存当前方法数据的栈帧压入栈中。每次栈帧中的数据都是当前方法数据的副本。如果递归次数足够多,则栈中的栈帧所使用的内存超过了栈内存的最大容量。这时候JVM就会抛出StackOverflowError。

让我们看一个例子:

公共类堆栈{公共无效测试(){this.test(); } public static void main(String[] args){ for(;) new stack().test;最后会出现:

内存溢出的原因及解决办法(4大主流解决方案详解)

StackOverflowError错误信息简而言之,无论是因为栈帧太大还是栈内存太小,当无法分配新的栈帧内存时,JVM都会抛出StackOverFlowError。通常可以通过设置-Xss参数来更改堆栈内存的大小。

3.永久代/元空间溢出

永久区(Perm)存放虚拟机加载的类信息、常量、静态变量、JIT编译代码等。

在JDK 1.8中,永久区域被称为元数据的区域所取代,但它们的功能是相似的。它们都是用来保存类的元信息的。如果一个系统定义的类型过多,那么永久区可能会溢出,错误信息如下:

java.lang.OutOfMemoryError: PermGen spacejava.lang.OutOfMemoryError: Metaspace解决方案如下:

1、检查永久代空间或者元空间是否设置太小

2.检查代码中是否存在大量反射操作

3.转储后,使用mat检查是否存在大量反射生成的代理类。

4.放大并重启JVM

用户评论

稳妥

这篇文章写的真好!详细解释了内存溢出的原因,并提供了4个解决办法,太实用了!

    有14位网友表示赞同!

致命伤

学习了!原来内存溢出还有这么多原因,得好好看看这篇文章。

    有11位网友表示赞同!

刺心爱人i

文章内容很丰富,看完之后对内存溢出有了更深入的理解,推荐收藏。

    有18位网友表示赞同!

熏染

4大主流解决方案都很实用,我感觉可以试试“优化代码结构”,看看效果如何。

    有12位网友表示赞同!

tina

讲的太细致了,感觉对解决内存溢出问题很有帮助,谢谢分享。

    有9位网友表示赞同!

糖果控

内存溢出真是个头疼的问题,文章分析的很好,值得一看。

    有14位网友表示赞同!

枫无痕

终于找到一篇靠谱的文章了,写的通俗易懂,容易理解。

    有11位网友表示赞同!

泡泡龙

收藏了!以后遇到内存溢出问题就看这篇文章了。

    有10位网友表示赞同!

执拗旧人

看完这篇文章,感觉对内存溢出有了更深的认识,受益匪浅!

    有7位网友表示赞同!

莫失莫忘

内容很全面,从原因到解决方案都讲的很清楚,很不错。

    有10位网友表示赞同!

余温散尽ぺ

文章结构清晰,内容实用,强烈推荐!

    有9位网友表示赞同!

我要变勇敢℅℅

学习了!原来内存溢出还有这么多解决办法,真是涨知识了。

    有9位网友表示赞同!

开心的笨小孩

文章对每个解决方案都给出了具体的示例代码,方便理解。

    有8位网友表示赞同!

没过试用期的爱~

太棒了!终于找到一篇解释内存溢出的文章了,以前一直不太懂。

    有14位网友表示赞同!

微信名字

感觉这篇文章对解决实际问题很有帮助,值得反复阅读。

    有15位网友表示赞同!

莫名的青春

文章内容很棒,就是有些地方感觉有点难懂,需要多看几遍才能理解。

    有14位网友表示赞同!

哥帅但不是蟋蟀

讲的比较深入,对于理解内存溢出问题很有帮助。

    有13位网友表示赞同!

夜晟洛

收藏了!以后遇到内存溢出问题再回来看这篇文章。

    有14位网友表示赞同!

墨城烟柳

这篇文章写的太好了,解决了我一直以来对内存溢出的困惑。

    有5位网友表示赞同!

你的眸中有星辰

强烈推荐这篇文章,对理解和解决内存溢出问题非常有帮助!

    有8位网友表示赞同!

标题:内存溢出的原因及解决办法(4大主流解决方案详解)
链接:https://yyuanw.com/news/sypc/19269.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
绯红之境兑换码最新2021 礼包兑换码大全

绯红之境兑换码最新2021 礼包兑换码大全[多图],绯红之境兑换码怎么领取?绯红之境兑换码有哪些?绯红之境在今日

2024-09-24
妄想山海怎么加好友 加好友方法大全

妄想山海怎么加好友 加好友方法大全[多图],妄想山海添加好友功能在哪里?妄想山海添加好友的方法是什么?好友添

2024-09-24
三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法

三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法[多图],三国群英传7霸王再临怎么玩?三国群英传7霸王再临

2024-09-24
江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略

江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略[多图],江南百景图又见桃花村钓鱼怎么钓?又见桃花村钓

2024-09-24