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

数据库java内存溢出原因

  • 内存
  • 2024-08-15 07:26:13
  • 2663

一、内存溢出怎么解决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
 【注意】:
 JVM的Perm区域主要用来存储使用的类和元信息被放置在PermGenspace中,并且该区域成为老年代。主程序执行期间GC不会清理旧区。默认大小为64MB,如果超过64MB,则需要增加这部分内存。
[情况4]:
emoryError:Directbuffermemory
通过添加JVM配置调整-XX:MaxDirectMemorySize=参数,例如:
-XX:MaxDirectMemorySize=128m
[情况5]:
emoryError:unabletocreatenewnativethread
[原因]:没有足够的堆栈空间来创建额外的线程,要么创建了太多线程,要么堆栈空间不足真的很小。
【解决办法】:由于JVM没有提供任何参数来设置堆栈内存总大小,因此可以将除text/之外的单线程堆栈大小设置为3GB。数据/BSS/内存映射段此外,堆和堆栈空间的总量是有限的,并且会出现盛衰。因此,如果出现这个错误,可以通过两种方式修复:1、通过-Xss启动参数减小单个线程批的大小,允许开启更多的线程(当然也不能太小,太小了)。导致堆栈溢出错误);2、通过-Xms-Xmx两个参数减少堆大小,释放内存到栈(假设堆空间足够)。
[情况6]:
verflowError
[原因]:这也是内存溢出错误的一种,即线程堆栈溢出或者方法调用层次过多(例如B.存在无限递归调用)或者线程栈太小。
【解决方案】:优化程序设计,减少方法调用次数。调整-Xss参数以增加线程堆栈大小。


二、Java内存溢出主要有哪些类型?OutOfMemoryError主要有三种
第一类:PermGenspace
这个问题的最初目的是程序中使用了大量的jar或者类,导致Java虚拟机没有足够的空间来加载类,它与PermanentGenerationspace有关。解决此类问题有两种方法:
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架构的程序时很容易出现这类内存溢出错误。使用上面的方法,我成功解决了部署ssh项目时Tomcat服务器频繁宕机的问题。
2.清理应用程序中web-inf/lib中的jar。如果tomcat部署了多个应用,并且多个应用使用相同的jar,可以将常用的jar移至tomcat的commonlib中,以减少重复负载。类。
第二个OutOfMemoryError:Javaheapspace
这个问题的原因是Java虚拟机创建了太多的对象。在垃圾回收过程中,虚拟机分配的堆内存空间丢失了。关于堆空间,已满。解决此类问题有两种思路:
1.测试程序,看看是否存在无限循环或不必要的重复创建大量对象。找到原因后,修改程序和算法。
当我使用K-Means文本聚类算法编写文本聚类程序,对数万条文本记录(每条记录大约有10个特征向量)进行文本聚类时,由于程序细节问题,Javaheapspace的内存溢出问题后来通过修改程序解决了。
2.增加Java虚拟机中的Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。例如:setJAVA_OPTS=-Xms256m-Xmx1024m
第三种OutOfMemoryError:Couldntocreatenewnativethread
当Java线程较多时,很可能会出现这种错误。