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

开发 后端
本文向大家描述一下JVM内存溢出的两大类型,JVM管理两种类型的内存,堆和非堆,堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。

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

JVM内存溢出类型

1、java.lang.OutOfMemoryError: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默认的大小(4M)那么就会产生此错误信息了。

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

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

2、java.lang.OutOfMemoryError:Javaheapspace

  再来看一下JVM内存溢出的第二种情况,***种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-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. 巧解Tomcat中JVM内存溢出问题
  2. 探究JVM1.6与JVM1.5性能差距
  3. JVM监控在本地和远程的应用
  4. 全面认识Eclipse中JVM内存设置
  5. JVM启动参数中标准参数列表速查手册
责任编辑:佚名 来源: hi.baidu.com
相关推荐

2020-12-29 07:56:23

JavaScript数据类型 primitive

2010-05-07 16:13:07

Oracle归档模式

2010-09-17 16:18:43

Java内存溢出

2010-06-11 17:01:09

Windows Pho

2009-06-16 11:01:14

Java内存溢出

2010-06-09 10:38:07

UML类图

2010-09-27 13:14:42

JVM内存限制

2010-09-30 14:35:36

JS浮点溢出

2019-08-29 14:29:42

JVM内存 Java

2012-03-21 09:25:47

微软云计算Azure

2012-09-19 14:07:31

私有云解决方案企业系统管理私有云

2012-05-15 02:04:22

JVMJava

2018-02-05 22:21:38

物联网工业物联网数字化

2021-06-28 06:45:06

内存溢出内存泄露JavaScript

2016-08-22 08:36:14

ReactiveCoc内存泄漏GitHub

2021-01-11 10:10:23

开发文本溢出开发技术

2010-05-17 14:36:11

2018-12-20 10:17:35

JVM模型内存溢出

2023-07-24 09:00:00

数据库

2022-06-09 11:52:40

KubernetesOpenEBSLinux
点赞
收藏

51CTO技术栈公众号