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

java导致内存溢出的情况(java大文件读取内存溢出)

  • 内存
  • 2024-08-14 22:19:37
  • 7245

一、java内存溢出的问题如何排查众所周知,在Java程序中,内存溢出是一个常见的错误。让我们从基本面分析开始吧!
内存溢出是由于太多未引用的对象(垃圾)导致JVM无法及时回收而导致的内存溢出。如果出现这种情况,您可以执行代码排查:
1)无论应用程序中的类和引用变量中是否使用了过多的静态修改(例如publicstaitcStudents),最好对类内的属性进行静态修改;仅使用基本类型或字符串。如publicstaticinti=0;//publicstaticStringstr;
2)应用程序是否使用大量递归或无限递归(递归使用许多新对象)
3)应用程序是否使用多个循环或无限循环(循环中使用了大量新创建的对象)
4)检查应用程序是否使用了从数据库中查询所有记录的方法。也就是说,如果数据量超过10万条,一次性查询的方式就会导致内存溢出。因此,查询时建议使用“分页查询”。
5)检查是否存在引用对象而不是对象的数组、列表或存储映射,因为这些引用将阻止释放相应的对象。将大量存储在内存中。
6)检查是否使用了“非文字字符串+”操作。由于String类的内容是不可变的,因此每次运行“+”时都会创建新对象。如果new的String对象过多,就会出现过多的newString对象,导致JVM无法及时回收它们。并导致内存溢出。
如Strings1="Myname";
Strings2="is";
Strings3="xuwei";
Stringstr=s1+s2+s3+.....;这样很容易造成内存溢出
但是Stringstr="Myname"+"is"+"xuwei"+"nice"+"to"+"meetyou";//但是这样不会造成内存溢出。由于这是一个“字符串”,运行“+”就会在编译过程中运行。它不会被JVM执行。
使用String、StringBuffer和StringBuilder时,如果字符串文字用于“+”,则应使用String以获得更好的性能;如果“+”使用String类,如果不考虑线程安全,应该使用String。选择性能更好的StringBuilder。
一旦知道原因,解决办法就很简单了。
二、outofmemoryerror怎么解决如何修复内存不足错误?我们一起来看看:
内存不足错误,也称为内存溢出,在Java方法中比较常见。通常有两种常见情况会发生这种情况。
1.
OutOfMemoryError:PermGenspace
出现这种情况可能是因为程序中使用了大量的JAR或者类,导致Java虚拟机没有足够的空间来加载相关的类到永久代空间。
如果要解决问题,一般有两种方法:
1.首先是在Java虚拟机中增加参数XX:PermSize和XX:MaxPermSize,其中XX:PermSize是永久内存区域的初始大小,XX:MaxPermSize是永久内存区域的最大大小。
例如,对于Tomcat6.0,在或文件中一系列环境变量名称描述的末尾添加一行,即第70行左右,具体为:
JAVA_OPTS=-XX:PermSize=64M-XX:MaxPermSize=128m
如果是Windows服务器,也可以在系统环境变量中设置。使用Tomcat发布Sprint+Struts+Hibernate架构的程序时很容易出现此类内存溢出错误。使用以上方法,基本上就可以解决问题了。
2.第二种方法是清理应用程序中web-inf/lib下的JAR文件。如果Tomcat提供了多个应用程序,并且多个应用程序使用同一个JAR,则可以将共享的JAR移动到Tomcat的共享库中,以减少重复的类加载。这个方法总体来说还是不错的。当,如果有选择的话,还是使用第一种方法更好。
2.
OutOfMemoryError:Javaheapspace
出现这个问题的原因也可能是Java虚拟机在垃圾回收之间创建了太多的对象并且在堆内存空间已满的情况下分配了太多的对象,这与堆空间有关。
如果要解决这个问题,一般有两种方法:
1.首先,可以检查程序是否存在无限循环或者不必要的重复创建大量对象的情况。找到原因后,可以更改程序和算法。
2.您还可以增加Java虚拟机中的Xms(即初始堆大小)和Xmx(即最大堆大小)参数的大小。
例如:setJAVA_OPTS=-Xms256m-Xmx1024m
当然,具体细节还要根据实际情况而定。您需要确定问题,然后选择正确的方法来解决它。