Docker内JVM参数的简单学习


背景

公司内部有K8S的项目.
基于K8S内容器的JVM参数的设置与标准虚拟机运行不太一样.
产品内部的启动脚本有一个设置, 在内存大于16G的情况下
默认取内存总量的四分之一作为堆区.
在虚拟化时 这样处理其实是没有问题的, 但是容器内运行可能存在问题.
Docker 运行能够看到宿主机所有的内存,
这样计算可能会超过Docker容器的资源限制
会导致被OOM-killer 需要注意 OOM-killer与 JVM的out of memory 是不一样的.
基于此, 最近几天研究了下容器内的JVM参数设置, 简要总结如下

关于JVM针对容器的支持情况

JDK1.8 是在191update 里面添加了对容器运行的识别与优化.
前期的版本可以使用参数进行开启, 但是因为我们不用这么低版本的JDK
这里只是简单记录一下的版本的参数:
-XX:+UnlockExperimentalVMOptions
-XX:+UseCGroupMemoryLimitForHeap
-XX:MaxRAMFraction=2
知识来源:
https://zhuanlan.zhihu.com/p/120168070?utm_source=wechat_session
需要注意 JVM使用的内存有:
总内存 = Heap + Code Cache + Metaspace + Symbol tables + Other JVM structures +
Thread stacks + Direct buffers + Mapped files + Native Libraries + Malloc overhead + ...

关于JVM针对容器的支持情况

高于JDK1.8u191版本的JDK就会好很多
有几个浮点类型的参数可以使用
-XX:{Initial|Min|Max}RAMPercentage
使用者几个参数之后会根据容器运行的资源限制自动进行堆区的划分.
注意有资料说(还是上一个知乎连接), 这里必须使用浮点类型的比如60.0和80.0
这样就会默认将 limits的限制的 60% 作为堆区.
其他内存用作栈区, codecache 方法区 源数据库 本地内存等. 注意 如果limits 限制比较小, 建议还是不能大部分用于堆区的,
避免非堆区出现OOM或者是栈溢出.

关于JVM内存占用的情况

在非容器的-Xms,-Xmx等参数以及-XX:{Initial|Min|Max}RAMPercentage的参数
按照阿里和Oracle JVM官方文档说明, 建议初始化/最小/最大都设置成一样的大小
避免因为JVM 堆区的收缩导致STW的时间增加. 影响客户体验. 但是虽然有最小和初始化的参数, 但是查看内存的resident memory 时发现启动时以及
启动后的一段时间 内存是与设置的数据不一样的. 其实核心问题是JVM为了启动的性能, 不会将申请的虚拟化内存直接进行initial处理.
只有用到时才会进行向操作系统申请具体的物理内存. 此时才会有具体的resident memory的变化. 需要注意可以使用 -XX:+AlwaysPreTouch 的方式在JVM启动时就将所有的内存进行初始化.
这样的话 JVM使用的内存就非常稳定了. 但是这样存在两个缺点和一个优点:
缺点: 启动时间会变慢, 增加了内存申请了初始化的时间损耗
JVM实际使用内存的曲线会失去效果, 无法看到堆区在哪段时间突然占用量升高.
优点: 内存都申请好了, 不会出现使用时先找操作系统申请的时间开销.

关于JVM的内存调优

JVM的堆区能大尽量大, 能够避免很多垃圾代码对堆区内存的挤占.
但是需要注意.JVM在大于32G的堆区时会取消指针压缩, 会多占用一部分堆栈指针使用的内存. 另外如果非专用服务器, 建议还是需要留出足够操作系统使用的内存.避免出现OOM-killer的现象. 如果是JVM的out-of-memory可以使用oom后事件重新启动服务.
-XX:OnOutOfMemoryError=/script/restart.sh
如果是容器运行, 可以使用 --restart=always的方式自动重启
如果是进程, 可以使用 systemd 服务的方式 增加restart 启动来解决问题
需要注意的是, 如果产品内有很多 相对路径的用户, 需要在systemd的服务里面添加:
WorkingDirectory=/xxxx/ 目录的方式来规避.

关于OOM后的处理参数

-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof    自动转储.
-XX:OnOutOfMemoryError=/xxxx/startup-linux.sh 自动重启
-XX:+ExitOnOutOfMemoryError 自动退出, 不建议,很难排查问题.
-XX:+CrashOnOutOfMemoryError 建议使用第一个,如果产品要求立即启动可以使用第二个.

典型的启动脚本

nohup java -Xms24g -Xmx24g -Xmn8g -verbose:gc -XX:+PrintGCDateStamps
-XX:+PrintGCDetails -Xloggc:log/gc-%t.log -XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=2 -XX:GCLogFileSize=100M -XX:+CrashOnOutOfMemoryError
-jar app.jar >/dev/null 2>&1 & # 注意 new 区域的大小是有根据业务场景来 有的都是大对象可以 new小一些
# 有的都是经常动态形成的对象, 可以设置的new区域大一些. 如果youngGC数据特别多, 可以考虑增加new区域.
# 如果老年代GC很多需要考虑增加老年代以及扩展堆区.
# 如果堆区内存无限制增加并且一直在GC要考虑是否存在内存泄漏的点.

Docker内JVM参数的简单学习的更多相关文章

  1. Docker 网络部分的简单学习以及转帖别人的blog

    1. 感谢一下 大神: http://www.cnblogs.com/sparkdev/ 最近有时间的话 就会读一下他的博客.学习了解docker相关的知识 今天简单做了下 测试 在这里面记录一下. ...

  2. Windows 下 Docker 的简单学习使用过程之一 dockertoolbox

    1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...

  3. JVM性能优化--JVM参数配置,使用JMeter简单测试配合说明参数调优

    一.JVM参数配置 1.常见参数配置 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 - ...

  4. 学习JVM参数前必须了解的

    JVM参数是什么 大家照相通常使用手机就够用了,但是针对发烧友来说会使用更专业的设备,比如单反相机,在单反里有好几个模式,P/A/S/M,其中P是傻瓜模式,程序会自动根据环境设置快门速度和光圈大小,以 ...

  5. Mybatis学习笔记15 - 两个内置参数_parameter和_databaseId

    两个内置参数:除了方法传递过来的参数可以被用来判断,取值外,mybatis默认还有两个内置参数: _parameter:代表整个参数 单个参数:_parameter就代表这个单个参数 多个参数:参数会 ...

  6. 【学习】011 JVM参数调优配置

    自动内存管理机制 Java虚拟机原理 所谓虚拟机,就是一台虚拟的机器.他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为 系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box.Vmar ...

  7. Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    目录 [TOC] 1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...

  8. JVM参数(二)参数分类和即时(JIT)编译器诊断

    在这个系列的第二部分,我来介绍一下HotSpot JVM提供的不同类别的参数.我同样会讨论一些关于JIT编译器诊断的有趣参数. JVM 参数分类 HotSpot JVM 提供了三类参数.第一类包括了标 ...

  9. JVM参数汇总

    一.java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容:其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足 ...

  10. jvm参数优化

    一.HotSpot JVM 提供了三类参数 现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色.例如:自适应内存管理.垃圾收集.及时编译.动态类加载.锁优化等.虽然有 ...

随机推荐

  1. 语音识别端到端模型解读:FSMN及其变体模型

    摘要:在很长一段时间内,语音识别领域最常用的模型是GMM-HMM.但近年来随着深度学习的发展,出现了越来越多基于神经网络的语音识别模型. 一.概述 在很长一段时间内,语音识别领域最常用的模型是GMM- ...

  2. 云图说 | Workflow:流水线工具,助您高效完成AI开发

    摘要:Workflow是将ML Ops(机器学习和DevOps的组合实践)应用于ModelArts平台,可以让您更高效的完成AI开发. 本文分享自华为云社区<云图说 | 第263期 Workfl ...

  3. DTT年度收官圆桌π,华为云8位技术专家的年末盘点

    摘要:收下这份DTT年度收官圆桌π总结,在新的一年心想事成,技术上更上一层楼. 本文分享自华为云社区<DTT年度收官圆桌π,华为云8位技术专家的年末盘点>,作者:华为云社区精选 . 在20 ...

  4. 全文手敲代码,教你用Java实现扫雷小游戏

    摘要:本程序共封装了五个类,分别是主类GameWin类,绘制底层地图和绘制顶层地图的类MapBottom类和MapTop类,绘制底层数字的类BottomNum类,以及初始化地雷的BottomRay类和 ...

  5. Android WebView 踩坑日记,字体怎么突然变小了???

    背景 最近,端内在做 webView 统一的时候,个性签名中的 WebView 替换为 CustomWebView 之后,发现字体突然变小. 一开始不知道是什么原因,通过二分法查找最近的提交,排查之后 ...

  6. expect --批量传递公钥

    #!/binbash ! rpm -qa |grep expect &> /dev/null && yum -y install expect #判断是否已下载expec ...

  7. #2028:Lowest Common Multiple Plus(n个数的最小公倍数)

    Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. Output 为每组测试数据输出它们的最小公倍数 ...

  8. 图扑虚拟现实解决方案,实现 VR 数智机房

    前言 如今,虚拟现实技术作为连接虚拟世界和现实世界的桥梁,正加速各领域应用形成新场景.新模式.新业态. 效果展示 图扑软件基于自研可视化引擎 HT for Web 搭建的 VR 数据中心机房,是将数据 ...

  9. 深入理解 Serverless 计算的并发度

    作者|西流(阿里云技术专家) 背景 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算[1],成为云计算的计算新范式.Serverless 为应用程序开发提供 ...

  10. 元素偏移量offset系列

    1.1 offset概述 offset翻译过来,就是偏移量,我们使用offset系列相关属性,可以动态的得到该元素的位置(偏移).大小等. 获取元素距离带有定位父元素的位置. 获得元素自身的大小(宽度 ...