Jenkins内存溢出异常

来源:互联网 发布:jquery1.11.3.js 下载 编辑:程序博客网 时间:2024/06/06 09:16

1. 操作环境

1. Windows:

  • win10

2. Jenkins

  • Jenkins 2.75

3. Java

  • JDK_1.8.0_64bit.exe

2、 java.lang.OutOfMemoryError: PermGen space

1. 问题产生原因

  PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

  该问题是由于JVM的底层设计缺陷所导致的,因为SUN的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛(比如说Spring的动态注入)。因而这个区域没有垃圾收回机制,所以现在的问题是Spring动态加载类到这个区域后,GC(Garbage Collection)根本没办法回收。

2. 解决办法

  如果Tomcat是以catalina.bat方式启动,比如说Windows操作系统,在catalina.bat的rem Guess CATALINA_HOME if not defined下面添加

set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m  

  如果Tomcat是以catalina.sh方式启动,比如说在Linux操作系统,则在catalina.sh的第一行增加

JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

3. 其它参考文档

  • PermGen space

3. java.lang.OutOfMemoryError: java heap space

1. 产生原因

  在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

  JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。

  这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.

  比如说我就曾经遇到过下面这种情况

这里写图片描述

2. 解决办法

  如果是以catalina.bat方式启动的,比如说Windows操作系统,在catalina.bat的rem Guess CATALINA_HOME if not defined下面添加

set JAVA_OPTS=-Xms64m -Xmx256m

  如果是以catalina.sh方式启动的,比如说Linux操作系统,在catalina.sh的前面添加

set JAVA_OPTS='-Xms64 -Xmx512'

3. 其它参考文档

  • Java heap space