• OOM时,dump内存出来;

  • 提供一种途径方便分析。

经过权衡,任务2的优先级是可以降低的。puvad只要把任务1做好就可以。所以,这两个任务最终变成:在Java应用出现OOM时,将内存dump到NAS中。

笔者在网上搜索一通,看到的方案基本就是启动一个sidecar容器,与应用共享一个目录。然后监控这个目录,发现内容就上传到s3这类对象存储中。

这种方案的问题在于:

  • sidecar在传输过程,有出现问题的风险;

  • 为了OOM这个小概率事件启动一个sidecar,资源有点浪费。

个人觉得,Java应用的Pod应该只负责将OOM时的内存dump到NAS即可,其它事情应该由其它Pod完成。

具体实现

==================================================================

以下方案是基于Helm自动化部署。如果你使用的是其它自动化部署工具,思路大体相同。

准备NFS服务

这部分不是本文范畴。

Java应用启动时参数配置

在Dockerfile中必须将变量$JAVA_OPTS加入到启动参数中。

FROM openjdk:11.0.12-jre-buster

COPY target/app.jar /app.jar

CMD java -jar $JAVA_OPTS /app.jar

加入InitContainers

作用:创建符合指定规则的Dump目录(注意DUMP_FOLDER变量的定义)。如下代码,在init容器启动后,它会创建目录:/nfs/dump/default/jvm-oom-example/10.233.66.38 。在应用出现OOM,内存文件会被dump在此目录下。

initContainers:

  • name: init

image: registry.cn-shenzhen.aliyuncs.com/aliacs-app-catalog/busybox:1.30.1

command: [‘sh’, ‘-c’, ‘echo $DUMP_FOLDER;mkdir -p $DUMP_FOLDER’]

{{- with .Values.volumeMounts }}

volumeMounts:

{{- toYaml . | nindent 12 }}

{{- end }}

env:

  • name: MY_NODE_NAME

valueFrom:

fieldRef:

fieldPath: spec.nodeName

  • name: MY_POD_NAME

valueFrom:

fieldRef:

fieldPath: metadata.name

  • name: MY_POD_NAMESPACE

valueFrom:

fieldRef:

fieldPath: metadata.namespace

  • name: MY_POD_IP

valueFrom:

fieldRef:

fieldPath: status.podIP

  • name: DUMP_FOLDER

value: “/nfs/dump/ ( M Y P O D N A M E S P A C E ) / i n c l u d e " a p p . f u l l n a m e " . / (MY_POD_NAMESPACE)/{{ include "app.fullname" . }}/ (MYPODNAMESPACE)/include"app.fullname"./(MY_POD_IP)”

配置应用容器

我们要做的,其实就是设置JAVA_OPTS环境变量。这里要注意的是JAVA_OPTS可以由三部分组成的:

  • 内存大小设置,比如:-Xmx640M Xms640M 这类;

  • GC算法设置,比如:-XX:+UseSerialGC

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

结语

小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

送给每一位想学习Java小伙伴,用来提升自己。

在这里插入图片描述

本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-gIsmU4f9-1712651042644)]

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐