我把老掉牙的Jenkins升级了,它跑了几天好好的;后来我有一个python脚本使用JenkinsAPI 0.3.9每隔2.5分钟发送约300余get请求,结果过了3天,它就挂了;当我开两个脚本时,40.5小时就挂了。(可以通过搜索Jenkins日志/var/log/jenkins/* 中字符Jenkins is fully uo and running.断定启动和终止时间)
在后续持续观察中,对外表现为:top中的RSS巨大,已经是设置的Xmx的3~4倍,显然不合理。

根据临终前的hs_xx日志和NMT看到,堆内存已经使用完,频繁full GC(这里说的不对,并没有频繁full GC,是我看错了日志,before和after我视为了两个),通常都是运行一段时间以后(有一个月,也有四天)突然内存暴增;经过一段时间的学习了解,可能是脚本触发了JenkinsBug, 其中的JNI调用的native code导致Native OOM,它把系统内存吃完了,再也没有内存可用了,在java进程申请新内存时,申请内存失败而退出。

曾经被pass的怀疑:
1).持有大量log造成的缓存而占用内存
2).大量TIMEWAIT造成,不够查看只有500~600,最多也不超过1000个,不应占如此大内存(同时发现之前TCP的知识没有整理,又忘光了!
3).Test Result Analyzer 造成内存泄漏,社区一直有人在提,虽然我们装了但是我们没有一直用,比如自动刷新会导致内存泄漏

开始学习了解RSS和Xmx的具体含义,为什么他们会不一致!(我期待他们约等,我甚至按照部门旧文档给Java8设置了MaxPerSize了呢!)

新的问题是什么是堆外内存,什么是JVM native memory,还有MetaSpaceSize它是属于哪里?它怎么增长?是否可以GC?什么是MaxDirectMemorySize ? Xss即栈内存的使用处于哪里?NativeMemoryTracking的用法?-XX:-UserCompressedOops and -XX:HeapBaseMiniAddress=n
hs_err_pid.log中MetaSpaceSize 内存的used,capacity,committed,reversed代表什么含义?
used capacity committed reversed

  • 堆外内存
    堆外内存(off-heap)不是一个准确的叫法,不必纠结于堆外内存和Native Memory 到底谁是谁. 我看了许多网上回答,SO上有个还说MetaData在堆上的,导致我当时非常混乱,当然后来看得多了就能辨出哪个说得不对了。 64位进程的内存基本是无限使用的,native即本地,但它不会脱离于Java进程,操作系统上看到使用了常驻内存有10G,那你JVM到底怎么花费这10G内存的?为什么有4G内存在NMT中看不到去哪里了?
  • NativeMemoryTracking的用法:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html
    -XX:NativeMemoryTracking=[off | summary | detail]
    NMT要配合jcmd使用
    jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]
    输出中各区域的意义和diff怎么看,文档中有详细的解释;他可以帮助你分析内存泄漏,但是

Enabling NMT will result in a 5-10 percent JVM performance drop and
memory usage for NMT adds 2 machine words to all malloc memory as
malloc header. NMT memory usage is also tracked by NMT.

但是NMT不记录非JVM申请的内存,所以native code 内存泄漏它分析不出

Since NMT doesn’t track memory allocations by non-JVM code, you may have to use tools supported by the operating system to detect memory leaks in native code.

通过NMT的输出,它把JVM使用的内存分成了 ‘Java Heap’、Class、Thread、 Code、 GC、 Compiler、 Internal、 Symbol、 ‘Memory Tracking’、 ‘Pooled Free Chunks’、 ‘Unknown’ 。Unknown 是NMT对CMS垃圾回收器支持不好。对于这几部分的解释:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr022.html#BABCBGFA

20200112
从dump的堆中来看,有400M左右的ref.finalizer, 现在怀疑是CPU资源不足,堆内存设置过大,full GC 频率过低(看过一次日志,运行了四天,21次full GC),导致finalizer清理线程没有及时清理持有的native memory,而请求频率高导致finaliable对象产生速率快,造成堆JVM整个内存过高,那么这个内存是属于哪里的呢?怎么控制?我如何核实? 关于finalizer: https://www.cnblogs.com/benwu/articles/5812903.html? :

关于finalize: http://www.enyo.de/fw/notes/java-gc-finalizers.html
2022.03.10
查看一个正在运行的JVM的参数 jcmd pid VM.flags
触发一次GC(完全等价于代码中运行System.gc()jcmd pid GC.run
查看一个正在运行的JVM的堆信息与垃圾回收器 jmap -heap pid
查看JVM GC原因:jstat -gccause pid 1000 每1000ms查看一次
使用NMT:-XX:+NativeMemoryTraking=detail jcmd pid VM.native_memory
当前JDK的默认参数 java -XX:+PrintFlagsFinal -version
修改运行中JVM参数 jinfo -flag flag_key=flag_value

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览106772 人正在系统学习中

[转帖]20191022-从Jenkins NativeOOM到Java8内存的更多相关文章

  1. Java8内存模型—永久代(PermGen)和元空间(Metaspace)(转)

    Java8内存模型—永久代(PermGen)和元空间(Metaspace) 查看原文点击传送门:http://www.cnblogs.com/paddix/p/5309550.html 提示:本文做了 ...

  2. (转)Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    背景:介绍java8中永久代到元空间的转变. Java8内存模型—永久代(PermGen)和元空间(Metaspace) 一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法 ...

  3. Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫“栈 ...

  4. Java虚拟机—Java8内存模型(整理版)

    1.概述 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要手动释放内存,不容易出现内存泄露和内存溢出问题.一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,排查错误 ...

  5. 【转帖】系统软件工程师必备技能-进程内存的working set size(WSS)测量

    系统软件工程师必备技能-进程内存的working set size(WSS)测量 2018年12月28日 18:43:01 Linuxer_ 阅读数:145 https://blog.csdn.net ...

  6. [转帖]Linux分页机制之概述--Linux内存管理(六)

    Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...

  7. 转:Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫“栈 ...

  8. Java8内存结构—永久代(PermGen)和元空间(Metaspace)

    本文转载 作者:liuxiaopeng 博客地址:https://www.cnblogs.com/paddix/p/5309550.html 一.JVM 内存结构 根据 JVM 规范,JVM 内存共分 ...

  9. Java8内存模型

    一.JVM内存模型 内存空间(Runtime Data Area)中可以按照是否线程共享分为两块,线程共享的是方法区(Method Area)和堆(Heap),线程独享的是Java虚拟机栈(Java ...

  10. [转帖]运维必读:Linux 的内存分页管理

    运维必读:Linux 的内存分页管理 https://cloud.tencent.com/developer/article/1356431 内存是计算机的主存储器.内存为进程开辟出进程空间,让进程在 ...

随机推荐

  1. PB从入坑到放弃(七)PBer们的福音来了

    写在前面 也许现在的你需要用PB完成毕业设计.需要维护远古时代的代码,又或者是你呆的公司就是要求要用PB开发项目. 不管你是出于什么原因还在使用PB,不可否认PB在数据窗口非常优秀,熟练使用之后开发数 ...

  2. 云图说|图解开天企业工作台MSSE

    摘要:开天企业工作台是面向企业用户的一站式数字工作台. 本文分享自华为云社区<[开天aPaaS]图解开天企业工作台MSSE>,作者:开天aPaaS小助手. 开天企业工作台(MacroVer ...

  3. 解读分布式调度平台Airflow在华为云MRS中的实践

    摘要:Airflow是一个使用Python语言编写的分布式调度平台,通过DAG(Directed acyclic graph 有向无环图)来管理任务. 本文分享自华为云社区<分布式调度平台Air ...

  4. 上手测试GaussDB(for Redis) 和开源 Redis,只为推荐质优价廉的Redis

    摘要:一文带你全方位测评 GaussDB(for Redis) 和开源 Redis. 本文分享自华为云社区<程序员硬核测评:全方位测评 GaussDB(for Redis) 和开源 Redis& ...

  5. 数字化转型鸿沟如何消除?ROMA Connect融合集成,联接企业应用现在与未来

    摘要:ROMA Connect平台正在以"联接和融合"的方式,重塑传统企业上云的路径--"条条大路"通向云端. 本文分享自华为云社区<[大厂内参]第13期 ...

  6. 解析WeNet云端推理部署代码

    摘要:WeNet是一款开源端到端ASR工具包,它与ESPnet等开源语音项目相比,最大的优势在于提供了从训练到部署的一整套工具链,使ASR服务的工业落地更加简单. 本文分享自华为云社区<WeNe ...

  7. 讲透学烂二叉树(五):分支平衡—AVL树与红黑树伸展树自平衡

    简叙二叉树 二叉树的最大优点的就是查找效率高,在二叉排序树中查找一个结点的平均时间复杂度是O(log₂N): 在<讲透学烂二叉树(二):树与二叉/搜索/平衡等树的概念与特征>提到 二叉排序 ...

  8. 将MyBatis Mapper xml 放到 jar 包外面

    在不改程序的情况下,修改 sql 时,需要将 Mapper 中的 XML 文件 放到外面 mybatis:    mapper-locations: classpath:mapper/*.xml #J ...

  9. 【django-vue】课程表数据录入 课程分类接口 所有课程接口 课程详情接口 所有章节接口 课程列表前端 课程详情前端

    目录 上节回顾 APSchudler 双写一致性 今日内容 1 课程表数据录入 2 课程分类接口 2.1 路由 2.2 序列化类 2.3 视图类 3 所有课程接口(过滤,排序) 3.1 表模型 3.2 ...

  10. Visual Studio 2022 激活码

    Pro: TD244-P4NB7-YQ6XK-Y8MMM-YWV2J Enterprise: VHF9H-NXBBB-638P6-6JHCY-88JWH Key 来自网络 备忘...