现状

加参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/test.dump 可以实现在jvm发生内存错误后 会生成dump文件 方便开发人员分析异常原因。

当运行在k8s中,如果进程发生错误 导出dump文件后 ,k8s会重启dokcer容器,上一次崩溃生成的dump文件就没有了。如果应用并没有完全崩溃 此时极其不稳定 最好也能通知到技术人员来处理。这样不方便我们排查原因 所有写了一个小工具。大概原理如下

1、 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/test.dump 当发生内存错误的时候 导出堆文件

2、 -XX:OnOutOfMemoryError=./dumpError.sh 当发生内存溢出的时候,让JVM调用一个shell脚本 这个shell脚本可以做一些资源整理操作 比如kill掉当前进程并重启

依赖上面2点jvm特性 就能做到把dump文件收集起来 是通知技术人员也好(比如发送订单、短信报警等)、然后再把dump文件上传到OSS 或者其他的文件存储中。 需要值得注意的是-XX:OnOutOfMemoryError=xx.sh 执行的脚本不能传脚本参数,所以尽可能把参数都封装在另一个脚本中。

方案实现

基于Go简单的写了一个上传阿里OSS的方法 这里用其他任何语言都可以的,至于用GO的原因很简单,有第三方库可以调用、运行的机器上也不用安装sdk、比较轻量。

大致逻辑如下

jvmdump.go

init获取程序的输入参数

func init(){
fmt.Println("init....")
flag.StringVar(&env, "env", "test", "test") //用于区分环境
flag.StringVar(&ddtoken, "ddtoken", "", "ddtoken") //用于报警用的 钉钉机器人TOKEN
flag.StringVar(&dumpFile, "dfile", "", "dfile") // dump文件的地址
flag.StringVar(&pod, "pod", "", "pod") //k8s中的pod 只是记录一下 方便排查
}

main函数逻辑


func main() {
fmt.Println("start invoke dump...")
flag.Parse() //解析输入参数
fmt.Printf("dumpFile %s ,env %s token %s\n",dumpFile,env,ddtoken)
exist, err := FileExists(dumpFile) //验证dump文件是否存在 只有存在的时候才去处理收集dump文件逻辑
if err != nil {
fmt.Printf("验证文件是否存在发生错误![%v]\n", err)
return
}
if exist {
//https://help.aliyun.com/document_detail/88604.html
var url=uploadOSS(dumpFile) //上传阿里oss
fmt.Printf("OSS上传完成 %s\n", url)
if enabledd{
//钉钉群机器人发送工具 https://github.com/braumye/grobot
notifyDD(url) //通知钉钉群机器人
}
}else{
fmt.Printf("dump文件不存在 %s\n",dumpFile)
}
}

构建可执行文件


set GOOS=linux
go build -ldflags "-w -s"

测试 验证go脚本是否正确

  echo "ffff">/opt/ttt.dump
./jvmdump -env test -dfile /opt/ttt.dump

如果能成功上传 就可以集成到jvm上跑了,不能成功上传的话 就需要调一下go了。

另外分享一个-XX:OnOutOfMemoryError=./dumpError.sh 参考。

有这个shell的原因是因为 由于jvmOnOutOfMemoryError目前没有找到可以传递脚本参数的方法。 所有不能调用./jvmdump文件 故包装一下,把参数都封装在dempError.sh中 ,把所有生成的dump文件 后缀命名都设置为.dump,主要是为了方便查找。放在一个独立的目录也是可以的。

dumpError.sh

#!/bin/bash

#循环目录
traverse_dir()
{
filepath=$1 for file in `ls -a $filepath`
do
if [ -d ${filepath}/$file ]
then
if [[ $file != '.' && $file != '..' ]]
then
#递归
traverse_dir ${filepath}/$file
fi
else
#调用查找指定后缀文件
check_suffix ${filepath}/$file
fi
done
#看需要 可以kill掉进程,避免jvm没有完全崩溃 k8s不会重启pod的情况 造成应用假死问题。
} #查找指定后缀的文件 这里在k8s环境里一般只会有一个dump文件,如果可能存在多个的dump文件文件的情况 可能需要变更一下逻辑
check_suffix()
{
file=$1 #如果找到dump就调用go写的jvmdump脚本
if [ "${file##*.}"x = "dump"x ];then
lib/jvmdump -e test -dfile $file -pod $HOSTNAME -ddtoken xxx
fi
}
traverse_dir /opt/logs

完整代码参考

https://github.com/peachyy/jvmdump2k8s.git

在k8s中收集jvm异常dump文件到OSS的更多相关文章

  1. 获取JVM的dump文件

    获取JVM的dump文件的两种方式 1. JVM启动时增加两个参数: #出现 OOME 时生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError #生成堆文件地址: -XX ...

  2. JVM调优 dump文件怎么生成和分析

    1.获取JVM的dump文件的两种方式 1. JVM启动时增加两个参数: #出现 OOME 时生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError #生成堆文件地址: - ...

  3. Java内存泄漏分析系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用

    原文地址:http://www.javatang.com JVM Heap Dump(堆转储文件)的生成 正如Thread Dump文件记录了当时JVM中线程运行的情况一样,Heap Dump记录了J ...

  4. C# 异常内存信息导出Dump文件

    背景:很多情况下程序崩溃我们只能看到程序抛出来的异常信息,但是有时候异常信息不清不楚我们处理异常还是一头雾水,这种情况下我们就很希望能有种办法获取程序运行时的内存进行调试,查看其中的变量.参数.方法执 ...

  5. jvm内存快照dump文件太大,怎么分析

    1.场景 通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出. 对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策. 这时候怎么办 ...

  6. WinDbg抓取程序报错dump文件的方法

    程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...

  7. K8S学习笔记之k8s日志收集实战

    0x00 简介 本文主要介绍在k8s中收集应用的日志方案,应用运行中日志,一般情况下都需要收集存储到一个集中的日志管理系统中,可以方便对日志进行分析统计,监控,甚至用于机器学习,智能分析应用系统问题, ...

  8. [Java基础] 使用JMAP dump及分析dump文件

    转载:http://blog.csdn.net/kevin_luan/article/details/8447896 http://liulinxia02.blog.163.com/blog/stat ...

  9. Dump文件的生成和使用

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lk142500/article/detai ...

随机推荐

  1. sunny 内网穿透使用。

    启动方法:

  2. 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02

    百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...

  3. 通过Git在本地局域网中的两台电脑间同步代码

    0.前言 一般情况下同步代码可以通过在GitHub/GitLab等网站新建远程仓库,所有机器都向仓库推送或者从仓库下拉更新. 上述过程步骤也不算复杂,不过有时候我们考虑到仓库的安全性等因素,只想在局域 ...

  4. 【vue】获取异步加载后的数据

    异步请求的数据,对它做一些处理,需要怎么做呢?? axios 异步请求数据,得到返回的数据, 赋值给变量 info .如果要对 info 的数据做一些处理后再赋值给 hobby ,直接在 axios ...

  5. 5.java内存模型详细解析

    一. java结构体系 Description of Java Conceptual Diagram(java结构) 我们经常说到JVM调优,JVM和JDK到底什么关系,大家知道么?这是java基础. ...

  6. MacOS上通过虚拟机搭建基础CentOS7系统环境

    MacOS上通过虚拟机搭建基础CentOS7系统环境 尽管从Mac的Terminal可以看出,macOS与UNIX.Linux或多或少都有血缘关系(shell.bash等),但是在mac进行Linux ...

  7. 2020 年国内 Serverless 用户规模:阿里云占比第一,达 66%

    在中国信息通信研究院重磅发布的国内首个<云原生用户调查报告>中,阿里云 Serverless 产品凭借在双十一的技术锤炼和丰富的应用实践,在国内 Serverless 用户规模的占比达到 ...

  8. Space Time Pattern Mining Tools(时空模式挖掘工具)

    时空模式挖掘工具 # Process: 局部异常值分析 arcpy.LocalOutlierAnalysis_stpm("", "", 输出要素, " ...

  9. NOI 2021 部分题目题解

    最近几天复盘了一下NOI 2021,愈发发觉自己的愚蠢,可惜D2T3仍是不会,于是只写前面的题解 Day1 T1 可以发现,每次相当于将 \(x\to y\) 染上一种全新颜色,然后一条边是重边当且仅 ...

  10. 题解 [HNOI/AHOI2018]毒瘤

    题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条边的无向图,问有多少个点集满足点集中任意两点均不存在边相连. \(n\le 10^5,m-n\le 10\),答案对 \(9982443 ...