电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

JVM内存溢出的两大类型及解决方案


发布日期:2021/5/21
 

你知道如何解决JVM内存溢出问题吗这里和大家分享一下JVM管理两种类型的内存堆和非堆堆是给开发人员用的上面说的就是是在JVM启动时创建非堆是留给JVM自己用的用来存放类的信息的

JVM内存溢出的详细解决方案

JVM内存溢出类型

javalangOutOfMemoryError:PermGenspace

JVM管理两种类型的Java内存堆和非堆堆是给开发人员用的上面说的就是是在JVM启动时创建非堆是留给JVM自己用的用来存放类的信息的它和堆不同运行期内GC不会释放空间如果webapp用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小超出了也会导致这块内存的占用过多造成JVM内存溢出或者tomcat热部署时侯不会清理前面加载的环境只会将context更改为新部署的非堆存的内容就会越来越多

PermGenspace的全称是PermanentGenerationspace是指内存的永久保存区域这块内存主要是被JVM存放Class和Meta信息的Class在被Loader时就会被放到PermGenspace中它和存放类实例(Instance)的Heap区域不同GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理所以如果你的应用中有很CLASS的话就很可能出现PermGenspace错误这种错误常见在web服务器对JSP进行precompile的时候如果你的WEBAPP下都用了大量的第三方jar其大小超过了jvm默认的大小(M)那么就会产生此错误信息了

一个最佳的配置例子(经过本人验证自从用此配置之后再未出现过tomcat死掉的情况)

setJAVA_OPTS=Xmsm

XmxmXX:PermSize=M

XX:MaxNewSize=m

XX:MaxPermSize=m

javalangOutOfMemoryError:Javaheapspace

再来看一下JVM内存溢出的第二种情况第一种情况是个补充主要存在问题就是出现在这个情况中其默认空间(即Xms)是物理内存的/最大空间(Xmx)是物理内存的/如果内存剩余不到%JVM就会增大堆到Xmx设置的值内存剩余超过%JVM就会减小堆到Xms设置的值所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小假设物理内存无限大那么JVM内存的最大值跟操作系统有关一般位机是g到g之间位的就不会有限制了

注意如果Xms超过了Xmx值或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来

垃圾回收GC的角色

JVM调用GC的频度还是很高的主要两种情况下进行垃圾回收

当应用程序线程空闲另一个是java内存堆不足时会不断调用GC若连续回收都解决不了内存堆不足的问题时就会报outofmemory错误因为这个异常根据系统运行环境决定所以无法预期它何时出现根据GC的机制程序的运行会引起系统运行环境的变化增加GC的触发机会

为了避免这些问题程序的设计和编写就应避免垃圾对象的内存占用和GC的开销显示调用SystemGC()只能建议JVM需要在内存中对垃圾对象进行回收但不是必须马上回收一个是并不能解决内存资源耗空的局面另外也会增加GC的消耗

上一篇:SWT:AWT和SWING的强大竞争者

下一篇:Swing实现Windows任务窗口