当前位置:首页 > 内存 > 正文

Java内存溢出详解

  • 内存
  • 2024-08-13 08:10:05
  • 9419

一、java内存溢出的问题如何排查众所周知,内存溢出是Java程序中常见的错误。让我们从一些基本分析开始。
内存溢出是由于未引用的对象(垃圾)过多而JVM无法及时回收它们而导致的内存溢出。如果您遇到此行为,您可以对代码进行故障排除。
1)当对类中的属性使用静态更改时,最好检查类或引用变量(例如publicstaitcStudents)是否有太多静态更改。仅使用基本类型或字符串。publicstaticinti=0;//publicstaticStringstr;等
2)应用程序是否大量使用递归或无限递归(递归大量使用新对象)?
3)应用程序是否大量使用递归?使用大量循环或无限循环(循环内部使用大量新创建的对象)
4)应用程序是否使用查询数据库中所有记录的方法检查。这意味着当数据量超过10万条时,一次性执行查询的方法可能会导致内存溢出。因此,在执行查询时必须使用“分页查询”。
5)检查是否存在存储对象引用而不是对象的数组、列表或映射。这是因为这些引用阻止了相应的对象被释放。大量存储在内存中。
6)检查是否使用了“非文字字符串+”操作。由于String类的内容是不可变的,每次执行“+”时都会创建一个新的对象,如果新的String对象过多,JVM将无法及时回收它们。并导致内存溢出。
Strings1="Myname";
Strings2="is";
Strings3="xuwei";
Stringstr=s1+s2+s3+....;等等容易造成内存溢出。
但是Stringstr="Myname"+"is"+"xuwei"+"nice"+"to"+"meetyou";//但是这样不会造成内存溢出。这是一个“文字字符串”,因此运行“+”将在编译期间执行它。它不是根据JVM运行的。
使用String、StringBuffer、StringBuilder时,当文字字符串用于“+”时,当String类用于“+”时,在不考虑线程安全的情况下应该使用String以获得更好的性能。选择StringBuilder可以提高性能。
一旦知道原因,解决办法就很简单了。
二、JVM内存溢出的两大类型及解决方案

你知道如何解决JVM内存溢出问题吗?这里给大家分享一下,JVM为开发者管理着堆和非堆两种内存。上面是JVM创建非堆堆时的情况。JVM本身用来存储类信息

JVM内存溢出详细解决方案

JVM内存溢出的类型

javalangOutOfMemoryError:PermGenspace

JVM管理Java内存堆和非堆两种类型。堆由开发人员使用。上面是JVM启动时创建非堆的。它是为JVM本身保留的,用于存储。班级信息。GC在不同的堆执行期间不会释放空间。如果Web应用程序使用大量第三方JAR文件或者应用程序有太多类文件并且MaxPermSize设置太小,那么该内存也会减少。太忙,导致JVM内存溢出或者Tomcat热部署时,不会清理之前加载的环境,只会修改新部署的不可堆叠内容的上下文。

一个比较好的配置示例(经本人验证,使用此配置后Tomcat从未死机)

setJAVA_OPTS=Xmsm

:javalangOutOfMemoryError:Javaheapspace

setJAVA_OPTS=Xmsm

我们来看看JVM内存溢出的第二种情况。第一种情况是补充。主要问题是在这种情况下它的默认空间(即堆到Xmx.如果剩余内存超过%,JVM会将堆减少到Xms定义的值,即Xmx。服务器端一般应将Xms参数设置为相同,以避免每次GC后调整VM堆大小。假设物理内存是无限的,最大JVM内存值与操作系统相关。位机介于g和g之间,但位大小不会。是有限制的。

GC垃圾收集的作用

JVM调用GC的频率还是很高的。垃圾回收主要有两种情况

当应用程序线程空闲,另外一种情况不足时,如果持续回收不能解决问题,就会不断调用JavaGC内存堆。如果内存堆不足,就会报outofmemory错误。由于该异常是由系统的运行环境决定的,因此无法预测何时会出现。根据GC机制,程序的执行会产生系统的运行环境。失败。更改增加了GC触发的机会

lishixinzhi/Article/program/Java/hx/201311/26579