一、JVM参数

  • -D 可以是系统默认有的参数,也可以是自己定义的参数
-Dfile.encoding=UTF-8
-Dmaven.test.skip=true
-Dspring.profiles.active=test
-Dhsf.server.port=12404
-Dhsf.http.port=12402
  • 堆内存参数
-Xmx5M 指定最大堆内存。 如 -Xmx4g。这只是限制了 Heap 部分的最大值为4g。这个内存不包括栈内存,也不包括堆外使用的内存,默认是物理内存的1/4。
-Xms5M 指定堆内存空间的初始大小。 如 -Xms4g。 而且指定的内存大小,并不是操作系统实际分配的初始值,而是 GC 先规划好,用到才分配。 专用服务器上需要保持 –Xms 和 –Xmx 一致,否则应用刚启动可能就有好几个FullGC。当两者配置不一致时,堆内存扩容可能会导致性能抖动,默认是物理内存的1/64。
-Xmn: 设置年轻代大小,等价于 -XX:NewSize,使用 G1 垃圾收集器不应该设置该选项,在其他的某些业务场景下可以设置。官方建议设置为 -Xmx 的 1/2 ~ 1/4。
-Xss:设置每个线程栈的字节数,影响栈的深度。例如 -Xss1m 指定线程栈为1MB,与-XX:ThreadStackSize=1m 等价。
  • GC 设置参数
-XX:+UseG1GC:使用 G1 垃圾回收器。
-XX:+UseConcMarkSweepGC:使用 CMS 垃圾回收器。
-XX:+UseSerialGC:使用串行垃圾回收器。
-XX:+UseParallelGC:使用并行垃圾回收器。
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC: jdk 11 以上开启 ZGC.
-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC:jdk 12 以上开启 ShenandoahGC。
  • 分析诊断参数
-XX:+HeapDumpOnOutOfMemoryError:当 OutOfMemoryError 产生,即内存溢出(堆内存或持久代/元空间) 时,自动 Dump 堆内存。
-XX:HeapDumpPath:与 HeapDumpOnOutOfMemoryError 搭配使用,指定内存溢出时 Dump 文件的目录。如果没有指定则默认为启动 Java 程序的工作目录。
java -Xmx5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/log/dump HeapOOM
自动 Dump 的 hprof 文件会存储到 /log/dump 目录下。

二、内存溢出排查

导致内存溢出的原因:

  • 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  • 资源使用之后没有及时关闭,导致对象无法被GC回收;
  • 代码中存在死循环或循环产生过多重复的对象实体;
  • 启动参数内存值设定的过小;

1. 测试内存溢出的代码:

@RestController
@RequestMapping
public class OOMDemoController { class OOMObject {
} @GetMapping("/oom/heap")
public void OOMHeap() {
List<OOMObject> list = new ArrayList<>();
while (true) {
list.add(new OOMObject());
}
} }

2.启动的时候设置堆内存大小和产生OOM的时候dump文件的输出:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/sun/Desktop -Xms10m -Xmx50m

3.调用/oom/heap接口就会堆内存溢出,此时桌面会生成一个java_pid1234.hprof的文件,然后用MAT工具打开该文件



点击工具栏上的 图标可以打开Histogram(直方图)视图,可以列出每个类产生的实例数量,以及所占用的内存大小和百分比。主界面如下图所示:



图中Shallow Heap 和 Retained Heap分别表示对象自身不包含引用的大小和对象自身并包含引用的大小;

其实从图中占用内存大小排序后,基本上就能看到那个类产生了OOM,然后从代码的角度去排查一下就好了,更加详细的MAT使用教程,可参考https://www.javatang.com/archives/2017/11/08/11582145.html

三、Java服务CPU飙升排查

@RestController
@RequestMapping
public class OOMDemoController {
@GetMapping("/cpu")
public void cpu() {
while (true) { }
}
}
  • 使用top命令找出CPU最高的进程PID
  • 使用jps命令找出对应的java程序
  • 使用top -H -p pid单独查看该进程的所有线程nid,此时nid是10进制,-H是进行排序
  • 找到CPU占用最高的线程号,然后转换为16进制,可以使用printf "%x\n" pid打印出来
  • 使用jstack -l [pid] | grep -A 20 [16进制线程号] (jstack -l 62170 | grep -A 20 f2da)

  • 可以输出到文件中查看jstack -l [pid] jstackLog.out
  • 根据WAITING或者BLOCKED大致判断是死循环还是死锁,然后回到程序中定位代码并且根据业务场景解决

java服务OOM和CPU飙升排查的更多相关文章

  1. JAVA服务实例内存高问题排查及解决

    生产服务内存高问题 问题描述 1."计算中心" 服务在生产环境运行一段时间后,实际占用内存4.8G,业务运行正常,未出现OOM.(本文以此服务进行排查) 2.生产环境的老项目,均出 ...

  2. CPU飙升排查

    怎么排查CPU飙升 线上有些系统,本来跑的好好的,突然有一天就会出现报警,CPU使用率飙升,然后重启之后就好了.例如,多线程操作一个线程不安全的list往往就会出现这种现象.那么怎么定位到具体的代码范 ...

  3. 记一次CPU飙升BUG

    图文地址:https://mp.weixin.qq.com/s?__biz=Mzg3NjEzODQ4NQ==&mid=2247483690&idx=1&sn=7c926f400 ...

  4. 开会时CPU 飙升100%同事们都手忙脚乱记一次应急处理过程

    告警 正在开会,突然钉钉告警声响个不停,同时市场人员反馈客户在投诉系统登不进了,报504错误.查看钉钉上的告警信息,几台业务服务器节点全部报CPU超过告警阈值,达100%. 赶紧从会上下来,SSH登录 ...

  5. Java服务CPU飙到99%问题排查

    最近生产环境中出现了一起CPU突然飙升的事件,下面介绍一下 CPU飙升问题排查的过程和解决方法. 该方案参考自:https://www.jianshu.com/p/e96c74133be6,感谢路遥N ...

  6. 【转】Java程序CPU飙升问题排查方法

    windows环境下cpu飙升问题 线上某台runtime机器(windows Server)cpu报警,这种情况初步就是代码里面死循环了,先把机器下线了保证不再有新的任务分配进来,然而cpu使用依然 ...

  7. Java死锁排查和Java CPU 100% 排查的步骤整理

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

  8. 线上CPU飙升100%问题排查,一篇足矣

    一.引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考讨论提高. 二.问题复现 线上系统突然 ...

  9. 面试连环炮系列(八):服务器CPU飙升100%怎么排查

    服务器CPU飙升100%怎么排查 执行"top"命令,查看当前进程CPU占用的实时情况,PID列是进程号,确定是哪个应用程序的问题. 如果是Java应用导致的,怎么定位故障原因 执 ...

  10. Java服务,内存OOM问题如何快速定位? (转)

    转自:公众号  架构师之路 问题:有一个Java服务出现了OOM(Out Of Memory)问题,定位了好久不得其法,请问有什么好的思路么? OOM的问题,印象中之前写过,这里再总结一些相对通用的方 ...

随机推荐

  1. TienChin 渠道管理-渠道搜索

    ChannelController @PreAuthorize("hasPermission('tienchin:channel:list')") @GetMapping(&quo ...

  2. 基于Ernie-3.0 CAIL2019法研杯要素识别多标签分类任务

    相关项目: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Paddl ...

  3. Python 运用zabbix开发简易巡检工具

    利用SSH或者Zabbix监控,配合Django开发框架,改造出属于自己的监控平台,实现包括主机图形,自动发现,计划任务,批量cmd执行,服务监控,日志监控等功能,由于公司机器混乱,基本上市面上的所有 ...

  4. Python常见设置

    pip的相关设置 设置镜像 为pip设置国内的镜像源可以提高Python库下载的速度,这里推荐使用清华大学的镜像站,使用如下命令配置: python -m pip install --upgrade ...

  5. 如何使用Ghost对UEFI+GPT+WIN10进行备份还原?

    以前BIOS兼容模式下用MBR分区表来备份还原系统使用Ghost很轻松就可以完成系统还原和备份,对于新版BIOS及支持GPT+UEFI快速启动的系统来说又应该如何备份还原呢?答案依旧是Ghost,只不 ...

  6. 借助 .NET 开源库 Sdcb.DashScope 调用阿里云灵积通义千问 API

    在昨天的博文中,我们通过 Semantic Kernel 调用了自己部署的通义千问开源大模型,但是自己部署通义千问对服务器的配置要求很高,即使使用抢占式按量实例,每次使用时启动服务器,使用完关闭服务器 ...

  7. 长沙IT技术圈百万年薪大佬?是否存在?

    引子 不知不觉,IT技术圈开始流传起"百万年薪"的故事,有人问我,长沙有百万大佬么?其实我也不知道. 一 背景 长沙自古以来就是文风鼎盛之地,在今天也同样如此. 目前长沙有211. ...

  8. Jsp+Servlet实现文件上传下载(四)--下载文件

    接着上一篇讲: Jsp+Servlet实现文件上传下载(三)--删除上传文件    点击打开链接 本章来实现一下下载文件功能,同时优化了一下上一章中的代码. 废话少说,上代码 ------------ ...

  9. C#-SendKeys方法的使用

    模拟键盘CTRL+S 的输入 using System; using System.Collections.Generic; using System.Diagnostics; using Syste ...

  10. [WEB安全] XSS攻击防御 Vue

    一.概念 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序. 这些恶意网页程序通常是JavaScript,但实际上也可以 ...