文档章节

https://zhuanlan.zhihu.com/p/61408911

xiaomin0322
 xiaomin0322
发布于 06/25 17:37
字数 924
阅读 9
收藏 0

在Logistimo,我们的所有应用程序都是Docker化的,并在Kubernetes内以docker容器运行。我们注意到在使用Java的容器上发生了大量重启,并且非常随机。Docker检查发现该pod被OOMKiller代码杀死:137。

这意味着应用程序消耗的内存比分配给容器的内存多。这听起来不对,因为我们使用-Xmx对Java应用程序进行了限制,并且我们为元空间和GC数据留下了大约20%的缓冲区作为Kubernetes资源限制(docker容器)。

例如,Java进程为2 GB,Kubernetes资源为2.4 GB。

后续部分将介绍此问题以及如何详细解决此问题。

 

JVM内存使用情况

第一步是检查容器超出上述限制的原因,显然这些是被缓冲充分利用了。

使用“ps”命令可以确认Xmx确实就位,并设置为最大4GB。

但是,“top”命令显示使用的物理内存为4.5 GB。

 

为什么Java会比分配多500 MB?

JDK 从1.8.40开始,引入了一个Native内存跟踪器工具,它提供了Java应用程序使用的内存的详细分解,并考虑了每个字节。请注意,NMT工具显示已提交,驻留可能更少。

实际使用=堆内存+元空间+Off堆

Off heap通常由类元数据,编译代码,线程和GC数据组成。GC数据是可变的,而其余部分应该对大多数应用程序保持静态。此内存是本机的(是的,包括元空间),JVM使用主机上的可用内存来增长或垃圾收集此数据。

回到手头的问题,JVM占用了500 MB,因为底层主机有16 GB的存储空间。有时这个数字可能高于我们设置的缓冲区,这将导致容器被终止。JVM不应该读取docker容器的内存限制吗?

 

容器和Java

事实证明,Java版本9及以下版本根本不了解容器/Docker(默认情况下)。它从底层主机中获取可用的CPU和内存。在容器内的主机上运行的每个Java应用程序都依赖于主机配置。考虑到我们是Kubernetes并且许多pod在单个节点上运行,这可能会导致我们面临的问题。

Java 10支持开箱即用的容器,它将查找linux cgroup信息。这允许JVM基于容器限制进行垃圾收集。默认情况下使用标志打开它。

-XX:+UseContainerSupport

值得庆幸的是,其中一些功能已被移植到8u131和9以后。可以使用以下标志打开它们。

-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap

 

总结

较旧版本的Java读取底层主机,并且不了解cgroup。这会导致容器配置和Java进程不匹配。这种不匹配在CPU和内存上。Java有一个Off堆内存组件,它有一个动态GC数据组件,可以增长。解决此问题的最佳方法是使用最新版Java中提供的容器支持功能。不要依赖缓冲(这是浪费钱)。

如果您必须继续使用这些主要版本并打开实验标志,请升级到Java 8u131 +或Java 9。更好的是,如果你可以获得Java 10以上将对所有容器有好处。

本文转载自:https://zhuanlan.zhihu.com/p/61408911

xiaomin0322
粉丝 142
博文 3872
码字总数 198223
作品 0
上海
架构师
私信 提问
第一次经历金三银四,前端面试总结

距离上次面试已经是21个月了,又要面试了,不免忐忐忑忑 小伙伴支招,最起码要投两轮简历吧: 第一轮,投不是最意向的,大公司小公司都投一下试试,了解一下市场对一年多工作经验的前端有什么...

瓦斯程序媛
2018/05/16
0
0
信息安全比赛平台相关收集(CTF比赛)

版权声明:转载请注明出处:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/81021236 学习教程与材料: 1、http://www.hackingarticles.in/ 一个外国人......

z奶油面包
2018/07/12
0
0
《斯坦福CS231n》学习笔记

版权声明:时间是有限的,知识是无限的,那就需要在有限的时间里最大化的获取知识。 https://blog.csdn.net/Firetocheat_/article/details/84891199 title: 斯坦福CS231n date: 2018-10-31 1...

bryce1010
2018/12/08
0
0
通俗易懂理解 AI “深度学习”的基本原理:梯度下降

[1] 用高中数学理解 AI “深度学习”的基本原理 https://mp.weixin.qq.com/s/Ok0HmeO2B-9N80mQ4B8IIA [2] 通俗易懂了解机器学习中的“回归”和“梯度下降方法”(一) https://zhuanlan.zhi...

大数据之路
2012/12/07
0
0
冰与火之歌居然是在 DOS 系统上写出来的

简评:《权力的游戏》第八季(最终季)终于开播了!这部美剧的原著小说有一个很有趣的冷知识 —— 它是在运行 DOS 系统的计算机上写出来的。其实不少老粉都已经知道这个典故,不过听到老爷子...

极光推送
04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux输入法fcitx的安装问题

Fcitx 总共要安装的包如下 fcitxfcitx-binfcitx-config-commonfcitx-config-gtk | fcitx-config-gtk2fcitx-datafcitx-frontend-allfcitx-frontend-gtk2fcitx-frontend-gtk3......

CHONGCHEN
42分钟前
3
0
网络基础

前言: 最近整理一些以前的学习笔记(有部分缺失,会有些乱,日后再补)。 过去都是存储在本地,此次传到网络留待备用。 计算机网络的功能: 1.数据通信; 2.资源共享; 3.增加数据可靠性; 4....

迷失De挣扎
42分钟前
3
0
spring boot升级到spring cloud

1、先升级spring boot 版本到2.1.3 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.3.RELEAS......

moon888
46分钟前
10
0
从蓝鲸视角谈DevOps

DevOps源于Development和Operations的组合 常见的定义 DevOps是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变...

嘉为科技
48分钟前
1
0
微服务设计 笔记

微服务设计 一、微服务架构理论 1.六边形架构 1)六边形架构(Hexagonal Architecture),又称为端口和适配器架构风格;使用适配器与外界进行交互,外界通过应用层API与内部进行交互。 2)经典...

啃不动地大坚果
57分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部