首页 > 系统相关 >k8s容器中的Java进程经常自动被杀

k8s容器中的Java进程经常自动被杀

时间:2024-11-26 18:24:35浏览次数:10  
标签:容器 Java Xmx 内存 JVM k8s CPU

故事背景

主角:低代码项目

时间:2023-08-29

背景:项目通过jenkins部署k8s容器到虚拟机,在一次部署之后,服务发生无限重启的现象,springboot项目起来后没多久(甚至有几次还没启动)就会被杀掉进程,服务宕机了一个晚上。

排查过程

查看日志

通过 kubelet logs 命令查看服务运行日志,未发现任何报错,只看到日志输出到一半就停止了输出,发现服务进入CrashBackOff,随后重启,无法定位问题。

本地调试

本地启动服务的同时,通过JProfile监控Java进程的CPU和内存使用情况,发现CPU稳定在20%左右,内存使用稳定在1~2GB,而k8s给pod分配的cpu核数是4,JVM配置的-Xms为2048m,-Xmx为4096m,排除内存泄漏和CPU过高。

查询资料

由于我没有服务器root权限,没法查看syslog,只能上网寻求答案。

 

看到这段话,我赶紧去检查了一下k8s对资源的限制,果然发现了问题!

 问题果然出在这里:k8s限制了内存资源为4G,同时JVM配置的-Xmx也是4G,-Xmx限制的只是Java堆的最大内存,还有栈、永生代、JVM本身、NIO中的DirectBuffer等资源会占用运行内存,导致容器中实际使用的内存超过了资源限制的阈值,进程被杀死。

解决方法

修改JVM参数-Xmx为2048m,重启服务后,正常运行。

参考资料

  1. https://blog.csdn.net/u012516914/article/details/109108660
  2. http://runxinzhi.com/lujiango-p-14933452.html

标签:容器,Java,Xmx,内存,JVM,k8s,CPU
From: https://www.cnblogs.com/little-nobody/p/18570745

相关文章

  • 八、在容器内获取Pod信息(Downward API)
    一、概述Pod的逻辑概念在容器之上,Kubernetes在成功创建Pod之后,会为Pod和容器设置一些额外的信息,例如Pod级别的Pod名称、PodIP、NodeIP、Label、Annotation、容器级别的资源限制等。在很多应用场景中,这些信息对容器内的应用来说都很有用,例如使用Pod名称作为日志记录的一个......
  • 你不知道的javascript-4
    this的指向,绑定规则,作用域1.什么是this?this是在函数执行时用来指代那个当前执行上下文的对象也就能说明this的值是在函数被调用时确定的,而不是在函数被定义时确定的因为只有当函数执行的时候,才会创建对应的FEC(函数执行上下文)2.为啥需要this?在常见的编程语言中,几乎......
  • 在k8s集群中创建新的用户,绑定集群并实现访问集群资源
    ​为了让普通用户能够通过认证并调用API,需要执行几个步骤。首先,该用户必须拥有Kubernetes集群签发的证书,然后将该证书提供给KubernetesAPI。创建私钥下面的脚本展示了如何生成PKI私钥和CSR。设置CSR的CN和O属性很重要。CN是用户名,O是该用户归属的组......
  • Java 异常处理
    目录:碎碎念:题目:问题描述原因分析:解决方案:碎碎念:    我知道我是低代码,但是只是完成个作业,所以就随便写了,能过测试点就行,没想到有个测试点死活过不去。题目:        设有一个整数数组a[],a有10个元素,其值依次为0到9。从键盘输入整数i的值,求a[......
  • JavaScript 类型转换
    基础概念什么是类型转换JavaScript是一种动态弱类型语言,其类型转换机制允许开发者灵活地处理不同数据类型之间的交互。类型转换是指将一个值从一种数据类型转换为另一种数据类型的过程,在JavaScript中主要分为两种方式:隐式类型转换:由JavaScript引擎自动执行,例如在算术运......
  • JavaScript 条件语句详解
    JavaScript条件语句概述条件语句的作用在JavaScript编程中,条件语句是控制程序流程的核心机制。它们使程序能够根据特定条件执行不同代码块,从而实现灵活的决策逻辑。通过使用if、if-else和switch等语句,开发者可以根据变量值或表达式结果动态地改变代码执行路径,使得程序能够......
  • Java中的final关键字详解
    在Java中,final关键字是一个非常重要的修饰符,用于控制变量、方法或类的不可变性或不可覆盖性。下面我将通过文字解释和代码示例详细讲解final关键字的用法。 1.final关键字概述final关键字可以用于以下三种场景:变量:用于声明常量,使其值在初始化后不能被修改。方法:用于......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-6- 元素基础定位方式-上篇 (详细教
    1.简介从这篇文章开始,就开始要介绍UI自动化核心的内容,也是最困难的部分了,就是:定位元素,并去对定位到的元素进行一系列相关的操作。想要对元素进行操作,第一步,也是最重要的一步,就是要找到这个元素,如果连元素都定位不到,后续什么操作都是无用功,都是扯淡,因此宏哥建议小伙伴或者同学们从......
  • DolphinScheduler JavaTask动态传参秘籍:轻松实现任务间数据流动
    ApacheDolphinScheduler的JavaTask可以通过在任务执行日志中输出特定格式的参数来支持OUT参数的下游传输,通过捕捉日志并将其作为参数传递给下游任务。这种机制允许任务间的数据流动和通信,增强了工作流的灵活性和动态性。那具体要怎么做呢?本文将进行详细的讲解。0修改一行源码......
  • JavaScript 中的“造物”艺术:对象、构造函数与原型
    走进JS,走近讶语在JavaScript的世界里,对象和面向对象编程(OOP)是不可或缺的一部分。本文将带你深入了解JavaScript中对象的创建方式,特别是ES6中引入的class语法,以及传统的构造函数和原型的概念。希望通过这篇文章,你能对JavaScript的面向对象编程有一个更深入的理解。1.造对象......