Docker内JVM参数的简单学习
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参数的简单学习的更多相关文章
- Docker 网络部分的简单学习以及转帖别人的blog
1. 感谢一下 大神: http://www.cnblogs.com/sparkdev/ 最近有时间的话 就会读一下他的博客.学习了解docker相关的知识 今天简单做了下 测试 在这里面记录一下. ...
- Windows 下 Docker 的简单学习使用过程之一 dockertoolbox
1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...
- JVM性能优化--JVM参数配置,使用JMeter简单测试配合说明参数调优
一.JVM参数配置 1.常见参数配置 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 - ...
- 学习JVM参数前必须了解的
JVM参数是什么 大家照相通常使用手机就够用了,但是针对发烧友来说会使用更专业的设备,比如单反相机,在单反里有好几个模式,P/A/S/M,其中P是傻瓜模式,程序会自动根据环境设置快门速度和光圈大小,以 ...
- Mybatis学习笔记15 - 两个内置参数_parameter和_databaseId
两个内置参数:除了方法传递过来的参数可以被用来判断,取值外,mybatis默认还有两个内置参数: _parameter:代表整个参数 单个参数:_parameter就代表这个单个参数 多个参数:参数会 ...
- 【学习】011 JVM参数调优配置
自动内存管理机制 Java虚拟机原理 所谓虚拟机,就是一台虚拟的机器.他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为 系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box.Vmar ...
- Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
目录 [TOC] 1.环境准备 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...
- JVM参数(二)参数分类和即时(JIT)编译器诊断
在这个系列的第二部分,我来介绍一下HotSpot JVM提供的不同类别的参数.我同样会讨论一些关于JIT编译器诊断的有趣参数. JVM 参数分类 HotSpot JVM 提供了三类参数.第一类包括了标 ...
- JVM参数汇总
一.java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容:其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足 ...
- jvm参数优化
一.HotSpot JVM 提供了三类参数 现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色.例如:自适应内存管理.垃圾收集.及时编译.动态类加载.锁优化等.虽然有 ...
随机推荐
- Multi-Architecture镜像制作指南已到,请查收!
摘要:使用Multi-Architecture镜像,可以让docker根据系统架构去拉取对应的镜像,服务的部署脚本等可以在不同架构的系统间使用相同的配置,减化服务配置,提高了服务在不同系统架构间的一致 ...
- 昇腾携手OpenMMLab,支持海量算法仓库的昇腾AI推理部署
摘要:近日,昇腾AI联合上海人工智能实验室,正式实现OpenMMLab算法仓库在昇腾的异构计算架构CANN上的推理部署,目前相关代码已推入MMDeploy 0.10.0版本,并在GitHub正式发布. ...
- CANN5.0黑科技解密 | 高并发图片视频处理,为出行保驾,为生活添彩!
摘要:华为推出昇腾AI基础软硬件平台(昇腾AI处理器+异构计算架构CANN),不仅能高效承接各类人工智能计算任务,还可两招解决以上图像处理面临的诸多问题. 四通八达的路网和车水马龙的盛景诠释着城市的繁 ...
- 再谈BOM和DOM(3):DOM节点操作-元素样式修改及DOM内容增删改查
操作节点,先得选择节点,就得知道节点选择器与DOM节点查找 DOM节点选择器 W3C提供了比较方便的定位节点的方法和属性 getElementById() 一个参数:元素标签的ID getElemen ...
- 使用appuploader工具流程(Windows版本)
转载:使用appuploader工具流程(Windows版本) 目录 转载:使用appuploader工具流程(Windows版本) 一.登录apple官网,注册账号 二.下载Appuploade ...
- PLS-00103: 出现符号 ")"在需要下列之一时
执行 Oracle 存储过程时,出现 "PLS-00103: 出现符号 ")"在需要下列之一时:", Cause: java.sql.SQLException: ...
- M-SOLUTIONS Programming Contest 2020 游记 (AB水题,CD模拟,E题DFS)
A - Kyu in AtCoder 水题 B - Magic 2 题意很好理解,但写的时候注意一下边界 void solve() { int a, b, c, k; cin >> a & ...
- Codeforces Round #544 (Div. 3)简单题解
复健,时间有限题解比较简陋 A. Middle of the Contest 将小时转成分钟,得到起止时间在一天中的分钟数,取平均值即可,复杂度O(1).平均值转换会时间的时候注意前导0. void ...
- 记一次 .NET某道闸收费系统 内存溢出分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序几天内存就要爆一次,不知道咋回事,找不出原因,让我帮忙看一下,这种问题分析dump是最简单粗暴了,拿到dump后接下来就是一顿分析. 二:Win ...
- C# 双向链表的实现
类数据 public class Objects { private int number; /**//* 货物编号 */ private string name; /**//* 货物名称 */ pr ...