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

java堆内存溢出

  • 内存
  • 2024-05-16 10:18:02
  • 4764

一、内存溢出怎么解决Java中常见的几种内存溢出及解决方法【场景一】:
emoryError:Javaheapspace:这是因为Java堆内存不够导致的。原因之一是它确实不够(例如太多)。递归级别等),另一个原因是程序存在死循环;
如果Java堆内存不够,可以通过调整JVM的如下配置来解决:
-Xms3062m
<-Xmx3062m
【情况2】
<[说明]:JDK6新增了一个错误类型,当GC采取长时间释放小空间;通常是因为堆太小,导致内存不足的异常。
【解决办法】:
<1.检查系统是否有使用大内存或者死循环的代码;
<2.通过添加JVM配置来限制内存使用:
<-XX:-UseGCOverheadLimit
[情况3]:
emoryError:PermGenspace:这是因为P区内存不够。可以调整JVM配置:
-XX:MaxPermSize=128m
<-XXermSize=128m
<[注意]:
[情况4]:
emoryError:Directbuffermemory
调整-XX:MaxDirectMemorySize=参数,例如添加JVM配置:
-XX:MaxDirectMemorySize=128m
[情况5]:
emoryError:unabletocreatenewnativethread
[原因]:没有足够的堆栈空间来创建额外的线程,或者创建了太多线程,或者堆栈空间真的很小。
【解决办法】:由于JVM没有提供设置总堆栈空间大小的参数,但是可以设置单个线程堆栈的大小,所以用户空间系统总计为3G,除了text/;数据/BSS/MemoryMapping段此外,堆和堆栈空间的总量是有限的,并且可以按比例放大和缩小。因此,如果遇到这个错误,可以通过两种方式解决:1、通过-Xss启动参数减小单个线程堆栈的大小,这样就可以开启更多的线程(当然不能太多小,太小了)会导致StackOverflowError);2.通过-Xms-Xmx这两个参数减少Heap的大小,将内存让给Stack(前提是Heap中有足够的空间)。
[情况6]:
verflowError
[原因]:这也是一种内存溢出错误,即线程堆栈溢出,或者方法调用层次过多(如存在无限递归调用)或者线程栈太小。
【解决方案】:优化程序设计,减少方法调用次数;调整-Xss参数以增加线程堆栈大小。


二、如何解决JAVA内存溢出的问题、JProfiler工具主要用于检查和跟踪系统性能(仅限于Java开发)。JProfiler可以通过随时持续监控系统内存使用情况、垃圾回收、线程运行状态等手段来监控JVM运行和性能。1.应用服务器的内存长期被不合理占用,并且内存经常被占用在较高的水平,并且很难恢复到较低的水平2.应用服务器非常不稳定,几乎每次都会重启两天,有时一天一次3、应用服务器经常重启做FullGC(GarbageCollection)时间较长,大约30-40秒应用服务器做FullGC时没有响应客户端事务请求,极大影响系统性能。由于开发环境和生产环境不同,生产环境有时会出现此问题通常可以使用工具来跟踪系统内存使用情况某些个别情况下,可能会在某个时间使用大量内存,导致outofmemory,这个时候,你应该跟踪一下,看看是否会进一步下降,如果一直保持在高位,那么肯定是由于程序原因导致的内存泄漏。5.不健康代码特征及解决方案1.尽早删除对无用对象的引用。一个好主意是使用临时变量,以便引用变量在离开活动域后自动设置为null,这意味着垃圾收集器会收集该对象并防止内存泄漏。对于仍然有指针指向它们的实例,jvm不会回收资源,因为垃圾收集会将空值的对象视为垃圾,以提高GC2回收机制的效率是不可避免的。我们程序中的字符串处理要避免使用String时,该使用很多StringBuffer,每个String对象都需要独立占用内存区域;str2;//如果str,str2在调用这个实现后不会再被使用,那么就会放到内存中等待gcJava来回收它,如果程序中这种情况发生太多,就会报上面的错误。建议使用StringBuffer而不是String这样可以节省很多开销3.尽量少用静态变量,因为静态变量是全局的,不会被对象创建GC回收,特别是大的JVM对象突然需要一个大的内存量大,肯定会触发GC来优化系统内存环境,而且申请数量大。这是大家在使用jspsmartUpload上传文件时要小心操作时经常出现emoryError错误经过检查,发现一个问题:组件中的代码m_totalBytes=m_tentLength();m_binArray=newbyte[。m_totalBytes];问题原因是totalBytes变量获取的量非常大,导致数组分配了大量的内存空间,而无法及时移除数组。唯一的解决方案是找到一种更合适的解决方案,至少是一种不会导致outofMemoryError的解决方案。参考:


三、Java内存溢出的解决方案都有哪些内存溢出的原因有以下几种:
内存中加载的数据量太大,导致一次从数据库中提取的数据过多;
调用接口为有时过时且等待时间过长;
认为集合类中的某个对象使用后没有清理掉,导致JVM无法回收它;
存在死循环;代码或循环生成太多重复对象;内存值设置太窄;更改分页查询;
设置接口调用时间变短,打印错误日志并修正接口时间;
使用后将集合类型设置为null,例如:执行完list后写入list=null
使用游戏逐渐找到无限文件的代码
jvm内存的值:-Xms1024m-Xmx1024m-XX:MaxNewSize=1024m-XX:MaxPermSize=1024m(状态值根据服务器内存size)
只是一个典型的手册,希。