jenkins怎么配置JVM(java exception)

简单来说,java.lang.OutOfMemoryError:GCoverheadlimitexceeded发生的原因是,当前已经没有可用内存,经过多次GC之后仍然没能有效释放内存。

大家好,又见面了,我是你们的朋友全栈君。

你好,我是看山。

本文已被《从小工到专家的 Java 进阶之旅》收录。

java.lang.OutOfMemoryError这个错误是比较经典的错误了,经过JDK不断的迭代,服务器硬件的不断升级。。。总之,社会在发展,时代在进步。很多错误已经消失在时代的浪潮中。我也是很久没有见过这个错误了,以至于都以为在Java的世界中不会再碰到这个错误。结果,就在最疏忽的时候碰到了TA,真是,心中一万只神兽奔袭而过,狠狠的践踏了我这颗上了年纪的心脏啊。

吐槽完毕,言归正传。

Java刚刚出现的年代,有一个相比于其他语言的优势就是,内存回收机制。不需要明确的调用释放内存的API,java就自动完成,这个过程就是Garbage Collection,简称GC。这对以懒著称的程序猿们来说,绝对是重大利好。但是,凡事有利必有弊,可以肯定的是,Java语言是人创造的,GC也是人编写的代码,绝对不是机器自动完成的。也就是说,GC的过程是另外一群程序猿根据可能出现的情况,预设了GC条件,把符合回收条件的内存空间释放出来。一旦被占用的内存空间不符合释放的条件,GC没办法清理,那就会适时出现java.lang.OutOfMemoryError。这个错误就是提醒我们这群程序猿,写GC程序的程序猿不知道这种情况怎么处理,为了安全也不便处理,谁使用Java就自己看着解决吧。

说起来,java.lang.OutOfMemoryError有几种分类的,这次碰到的是java.lang.OutOfMemoryError: GC overhead limit exceeded,下面就来说说这种类型的内存溢出。

简单来说,java.lang.OutOfMemoryError: GC overhead limit exceeded发生的原因是,当前已经没有可用内存,经过多次GC之后仍然没能有效释放内存。

1. 原因

众所周知,JVM的GC过程会因为STW,只不过停顿短到不容易感知。当引起停顿时间的98%都是在进行GC,但是结果只能得到小于2%的堆内存恢复时,就会抛出java.lang.OutOfMemoryError: GC overhead limit exceeded这个错误。Plumbr给出一个示意图:

java.lang.OutOfMemoryError: GC overhead limit exceeded

这个错误其实就是空闲内存与GC之间平衡的一个限制,当经过几次GC之后,只有少于2%的内存被释放,也就是很少的空闲内存,可能会再次被快速填充,这样就会触发再一次的GC。这就是一个恶性循环了,CPU大部分的时间在做GC操作,没有时间做具体的业务操作,可能几毫秒的任务需要几分钟都无法完成,整个应用程序就形同虚设了。

2. 示例

Plumbr上找的一个例子,这里直接给出。

class Wrapper { 
   
  public static void main(String args[]) throws Exception { 
   
    Map map = System.getProperties();
    Random r = new Random();
    while (true) { 
   
      map.put(r.nextInt(), "value");
    }
  }
}

然后设定堆内存是100m,比如java -Xmx100m -XX:+UseParallelGC Wrapper。不同的系统环境可能需要设置不同的堆内存大小,否则会产生不同的OOM错误。其实也算是好理解,因为java.lang.OutOfMemoryError: GC overhead limit exceeded需要有两个条件:98%的时间和2%的内存。如果这两个条件有一个没有达到,结果Map对象扩容,那就可能出现java.lang.OutOfMemoryError: Java heap space这个错误。

3. 解决方法

3.1 JVM参数

JVM给出一个参数避免这个错误:-XX:-UseGCOverheadLimit

但是,这个参数并不是解决了内存不足的问题,只是将错误发生时间延后,并且替换成java.lang.OutOfMemoryError: Java heap space

3.2 堆内存

还有一个偷懒的方法是:增大堆内存。既然堆内存少了,那就增加堆内存即可。

但是,这个方法也不是万能的。因为程序里可能有内存泄露。这个时候即使再增大堆内存,也会有用完的时候。

所以前两个方法都只是治标不治本而已。

3.3 终极方法

其实还是有一个终极方法的,而且是治标治本的方法,就是找到占用内存大的地方,把代码优化了,就不会出现这个问题了。

怎么找到需要优化的代码呢?就是通过heap dump生产jvm快照,通过分析快照找到占用内存大的对象,从而找到代码位置。

通过设置-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump参数来生产快照,然后通过VisualVM或者MAT等工具分析快照内容进行定位。通过这个参数是将发生OOM时的堆内存所有信息写入快照文件,也就是说,如果此时堆内存中有敏感信息的话,那就可能造成信息泄漏了。

推荐阅读


个人主页: http://www.howardliu.cn
个人博文: java.lang.OutOfMemoryError:GC overhead limit exceeded
CSDN主页: http://blog.csdn.net/liuxinghao
CSDN博文: java.lang.OutOfMemoryError:GC overhead limit exceeded

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128500.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月12日 上午6:00
下一篇 2022年4月12日 上午6:00


相关推荐

  • Vue + ElementUI 后台管理系统实现顶部一级菜单栏,左侧二级菜单栏

    Vue + ElementUI 后台管理系统实现顶部一级菜单栏,左侧二级菜单栏一、要求后台管理系统页面的整体结构如图:实现顶部一级菜单和左侧二级菜单进行响应,选哪个一级菜单时,左侧菜单栏有相对应下的二级菜单,产生联动效果。然后选不同的二级菜单,主体内容区域展示对应内容。二、效果图三、具体操作实现1、用vue-cli创建的Vue项目后,自己再手动搭建项目的基本目录结构,如图:2、创建一个公共组件Whole.vue来实现整体页面结构的布局,通过div来进行区域定位和大小设定。使用el-menu组件的mode…

    2022年6月6日
    318
  • 里氏代换原则详解

    里氏代换原则详解里氏代换原则定义 里氏代换原则 LiskovSubsti 面向对象设计的基本原则之一 里氏代换原则中说 任何基类可以出现的地方 子类一定可以出现 LSP 是继承复用的基石 只有当衍生类可以替换掉基类 软件单位的功能不受到影响时 基类才能真正被复用 而衍生类也能够在基类的基础上增加新的行为 里氏代换原则是对 开 闭 原则的补充 实现 开 闭 原则的关键步骤就是抽象化 而基类与子类的继承关系就是抽象化的具体实现 所以里氏代换原则是对实现抽象化的具体步骤的规

    2026年3月17日
    2
  • C语言 –位运算

    C语言 –位运算总结一下 自己脑子短路时可以查看一下 一 位运算符 逻辑运算符 amp 位 与 位 异或 位 或 位 非 取反移位运算符 lt lt 左移 gt gt 右移逻辑位运算都是以 bit 为单位 二 非 取反位取反的操作符为 0 变成 1 1 变成 0 需要注意的是 位取反运算并不会改变操作数

    2026年3月19日
    3
  • 理解51单片机最小系统的工作原理「建议收藏」

    理解51单片机最小系统的工作原理「建议收藏」51单片机最小应用系统概述要想使用单片机,第一个要搭建的电路就是单片机的最小系统,有了这个最小系统单片机就可以去正常的工作,即使没有其他的外围电路(显示器啥的),也可以对单片机进行程序的编写,程序也可以在单片机里面正常的运行。其包括MCS-51系列芯片一块,(51初步认识)电源电路,时钟电路,复位电路。51单片机最小系统原理图1.电源电路任何的电子设备都需要给其供应相对应的工作电源才可以正常工作,此芯片可用+5V的直流电源供电电源电路2.时钟电路单片机的芯片是数字电路芯片,数字芯片要想正常

    2022年6月23日
    36
  • python flask框架优点_flask框架有什么用

    python flask框架优点_flask框架有什么用Flask 框架的特点 1 轻巧 2 简洁 3 扩展性强 个人认为最重要的特点 4 核心 werkzeug 和 jinja2 jinja2 就是指模板引擎 Flask 确实很 轻 不愧是 MicroFramewo 从 Django 转向 Flask 的开发者一定会如此感慨 除非二者均为深入使用过 Flask 自由 灵活 可扩展性强 第三方库的选择面广 开发时可以结合自己最喜欢用的轮子 也能结合最流行最强大的 Python

    2026年3月26日
    2
  • 常用css样式大全以及css属性代码大全

    常用css样式大全以及css属性代码大全常用 css 样式大全字体属性 font 大小 font size x large 特大 xx small 极小 一般中文用不到 只要用数值就可以 单位 PX PD 样式 font style oblique 偏斜体 italic 斜体 normal 正常 行高 line height normal 正常 单位 PX PD EM 粗细 font weight bold 粗体 lighter 细体 normal 正常 变体 font va

    2026年3月18日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号