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

PermGen内存溢出

  • 内存
  • 2024-09-03 13:31:33
  • 6187

一、内存溢出怎么解决Java中一些常见的内存溢出及解决方案[场景1]:
emoryError:Javaheapspace:这是由于Java堆内存实际上不够(例如太多)引起的。递归级别),另一个原因是程序中存在无限循环。
如果您没有足够的Java堆内存,可以通过调整JVM的以下配置来解决此问题:
-Xms3062m
-Xmx3062m
【情况2】
emoryError:GCoverheadlimitexceeded
【说明】:JDK6有GC时抛出的错误是新的错误类型。当释放一小块区域需要花费大量时间时,一般是因为堆太小,而异常是内存不足引起的。
[解决方案]:
1.检查系统是否存在内存密集型代码或无限循环。
2.添加JVM配置以限制内存使用。
-XX:-UseGCOverheadLimit
[情况3]:
emoryError:PermGenspace:这是由于P区内存不足造成的。
-XX:MaxPermSize=128m
-XXermSize=128m
【注意】:
JVM的Perm区域主要用于类加载时的类和元数据由加载器用来存储信息。它将被放置在PermGenspace中,这个区域将是老年代。如果你的程序需要加载大量数据,GC将不会清理旧空间。如果对象超过64M,这部分内存就会溢出。通常128M就足够了。
[案例4]:
emoryError:Directbuffermemory
调整-XX:MaxDirectMemorySize=参数,包括添加JVM配置。
-XX:MaxDirectMemorySize=128m
[情况5]:
emoryError:unabletocreatenewnativethread
[原因]:堆栈空间不足以创建额外的线程否。创建了太多线程或堆栈空间不足。它真的很小。
【解决办法】:由于JVM没有提供设置栈空间总大小的参数,因此可以设置单个线程栈的大小。系统上的总用户空间为3G(不包括Text/)。此外,数据/BSS/内存映射段中的堆和堆栈空间总量是有限的,并且可以增长和收缩。因此,如果您遇到此错误,可以通过两种方式解决:1、使用-Xss启动参数减小单线程堆栈的大小,以便可以开启更多的线程(当然不能太小,但太小就能解决问题。)。StackOverflowError);2.通过--两个参数Xms通过Xmx减少堆大小并向堆栈分配内存(如果堆空间足够)。
[情况6]:
verflowError
[原因]:这也是一种内存溢出错误。即线程堆栈溢出,或者层级太多。方法调用次数(例如无限次递归调用),或者线程栈太小。
【解决方案】:优化程序设计,减少方法调用次数,通过调整-Xss参数增加线程堆栈大小。