探究两大Java内存溢出类型

开发 后端
Java内存溢出主要有两种情况,而JVM经常调用垃圾回收器解决内存堆不足的问题,但是有时仍会有内存不足的错误。作者分析了JVM内存区域组成及JVM设置虚拟内存的方式,从而给出了一系列解决方案。

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

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

一、Java内存溢出类型

1、java.lang.OutOfMemoryError:PermGenspace

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

PermGenspace的全称是PermanentGenerationspace,是指内存的***保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
一个***的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况)

  1. setJAVA_OPTS=-Xms800m  
  2. -Xmx800m-XX:PermSize=128M 
  3. -XX:MaxNewSize=256m 
  4. -XX:MaxPermSize=256m 
  5.  

2、java.lang.OutOfMemoryError:Javaheapspace

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

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

垃圾回收GC的角色

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

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

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

【编辑推荐】

  1. Java内存溢出的详细解决方案
  2. JVM体系结构目的和原理
  3. JVM.dll装载过程与源代码分析
  4. 巧解使Eclipse崩溃的JVM terminated问题
  5. 解决JVM Terminated.ExitCode=-1问题行之有效的方法
责任编辑:佚名 来源: 360doc.com
相关推荐

2010-09-26 16:04:48

JVM内存溢出

2010-09-30 14:35:36

JS浮点溢出

2011-07-01 10:42:51

IIS解析漏洞

2009-11-30 16:55:10

微软合作Novell

2024-03-11 08:22:40

Java内存泄漏

2010-09-14 17:27:12

DIV CSS定位

2011-08-10 08:55:28

项目失败

2010-07-15 14:25:06

Perl时间函数

2010-05-04 14:30:45

Oracle数据

2011-06-21 10:48:43

网络布线布线电磁

2010-10-09 16:28:51

J2MEDisplay类

2017-11-27 13:18:08

Cydia源iOSiPad

2020-11-11 12:18:22

ATT&CK网络攻击安全威胁

2010-04-01 09:34:06

Oracle函数

2009-08-14 15:07:00

C#编译过程

2011-12-08 09:55:08

iOS 5隐藏特性

2011-08-11 09:41:38

2010-09-07 16:46:25

H.323SIP

2013-12-23 09:25:21

2011-11-02 09:35:34

虚拟化虚拟化管理
点赞
收藏

51CTO技术栈公众号