每日热闻!七段小代码,玩转Java程序常见的崩溃场景!
清一色财经 2023-05-07 19:32:52

最近在看RCA(Root Cause Analysis)的东西,不小心发现了yCrash这么个东西。它的几段问题小代码写的非常典型,我们可以稍微看一下,来看看Java应用程序常见的几个崩溃场景。


(资料图片)

Java程序是基于GC的,在启动初始,就申请了足量的内存池,再加上JIT等编译器的实时优化,速度并不比直接用C++语言写的慢。Java语言同时由于反射和可观测等特点,再加上JFR这种神器,在发生问题的时候比二进制文件更容易找到它的根源。

最近在看RCA(Root CauseAnalysis)的东西,不小心发现了yCrash这么个东西。它的几段问题小代码写的非常典型,我们可以稍微看一下,来看看Java应用程序常见的几个崩溃场景。

1. 堆空间溢出

OOM 一般是内存泄漏引起的,表现在 GC 日志里,一般情况下就是 GC 的时间变长了,而且每次回收的效果都非常一般。GC后,堆内存的实际占用呈上升趋势。

下面的代码是死循环,持续向HashMap里塞数据,由于myMap属于GCRoots,始终得不到释放,所以它最终的结果就是OOM。

import java.util.HashMap;public class OOMDemo {   static HashMap myMap = new HashMap<>();   public static void start() throws Exception {       while (true) {         myMap.put("key" + counter, "Large stringgggggggggggggggggggggggggggg"               + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + "ggggggggggggggggggggggggggggggggggggggggggggggggggggg"                + counter);                  ++counter;      }   }   }

2. 内存泄漏

内存泄漏和内存溢出是一个道理,不同的是它的语意。

内存溢出可能是由于请求量过高,或者真实的业务需求需要所造成的后果,而内存溢出属于未知的、超出期望的OOM情况。

我们可以使用上面同样的代码达到这个目的。

在现实情况中,内存泄漏通常都非常的隐蔽,需要借助Mat等工具才能找到根本原因。jmap、pmap等是常用的工具。

比如,如果你忘记了重写对象的hashCode和equals方法,就会产生内存泄漏。

//leak example : created by xjjdog 2022import java.util.HashMap;import java.util.Map;public class HashMapLeakDemo {    public static class Key {        String title;        public Key(String title) {            this.title = title;        }    }    public static void main(String[] args) {        Map map = new HashMap<>();        map.put(new Key("1"), 1);        map.put(new Key("2"), 2);        map.put(new Key("3"), 2);        Integer integer = map.get(new Key("2"));        System.out.println(integer);    }}

3. CPU飙升

直接一个死循环,就可以把CPU干死。

public class CPUSpikeDemo {  public static void start() {    new CPUSpikerThread().start();    new CPUSpikerThread().start();    new CPUSpikerThread().start();    new CPUSpikerThread().start();    new CPUSpikerThread().start();    new CPUSpikerThread().start();    System.out.println("6 threads launched!");  }}public class CPUSpikerThread extends Thread {  @Override  public void run() {    while (true) {      // Just looping infinitely    }  }}

获取问题代码通常可以使用下面的方法:

(1)使用 top 命令,查找到使用 CPU 最多的某个进程,记录它的 pid。使用 Shift + P 快捷键可以按 CPU的使用率进行排序。

(2)再次使用 top 命令,加 -H 参数,查看某个进程中使用 CPU 最多的某个线程,记录线程的 ID。

(3)使用 printf函数,将十进制的 tid 转化成十六进制。

(4)使用 jstack 命令,查看 Java 进程的线程栈。

(5)使用较少命令查看生成的文件,并查找刚才转化的十六进制 tid,找到发生问题的线程上下文。

4. 线程泄漏

线程资源是昂贵的。如果你不停的创建线程,系统资源很快就会被耗尽。下面的代码一直不停的创建线程,如果同时请求压力比较大的话,多数能搞死宿主机。

public class ThreadLeakDemo {   public static void start() {      while (true) {         new ForeverThread().start();      }   }}public class ForeverThread extends Thread {   @Override   public void run() {      // Put the thread to sleep forever, so they don"t die.      while (true) {         try {            // Sleeping for 10 minutes repeatedly            Thread.sleep(10 * 60 * 1000);         } catch (Exception e) {}      }   }}

这是暴力啊,这和每个请求创建一个线程,或者创建一个线程池的后果是一样的。

java.lang.OutOfMemory错误:无法创建新的本机线程

5. 死锁

死锁代码一般不会发生,但一旦发生还是非常严重的,相关的业务可能就跑不动了。

public class DeadLockDemo {   public static void start() {      new ThreadA().start();      new ThreadB().start();   }}public class ThreadA extends Thread {    @Override     public void run() {        CoolObject.method1();    }}public class ThreadB extends Thread {    @Override      public void run() {          HotObject.method2();     } }public class CoolObject {    public static synchronized void method1() {       try {     // Sleep for 10 seconds     Thread.sleep(10 * 1000);          } catch (Exception e) {}          HotObject.method2();     }}      public class HotObject {   public static synchronized void method2() {       try {          // Sleep for 10 seconds          Thread.sleep(10 * 1000);       } catch (Exception e) {}       CoolObject.method1();   } }

死锁属于比较严重的一种情况,jstack 会以明显的信息进行提示。当然,关于线程的dump,也有一些线上分析工具可以使用。比如fastthread,但也需要你先了解这些情况发生的意义。

6. 栈溢出

栈溢出不会造成 JVM 进程死亡,危害“相对较小”。下面是一个简单的模拟栈溢出的代码,只需要递归调用就可以了。

public class StackOverflowDemo {   public void start() {      start();   }}

通过 -Xss 参数可以设置虚拟机栈的大小。比如下面的命令就是设置栈大小为 128K:

-Xss128K

如果你的应用经常发生这种情况,可以试着调大这个值。但一般都是因为程序错误引起的,最好检查一下自己的代码。

7. 被阻止的线程

BLOCKED是一个比较严重的线程状态,当后端的服务处理时间非常长,请求的线程就会进入等待状态。这时候通过jstack来获取堆栈,就会发现线程处于阻塞状态。它阻塞在对锁的获取上(watingto lock)

public class BlockedAppDemo {   public static void start() {      for (int counter = 0; counter < 10; ++counter) {      // Launch 10 threads.      new AppThread().start();      }   }}public class AppThread extends Thread {   @Override   public void run() {      AppObject.getSomething();   }}public class AppObject {   public static synchronized void getSomething() {      while (true) {         try {         Thread.sleep(10 * 60 * 1000);  } catch (Exception e) {}      }  }}

一旦频繁发生这种情况,就证明你的程序相应太慢了。如果CPU资源还有剩余,可以尝试着增加请求的线程数,比如tomcat的最大线程数。

结束

以上就是对于Java常见故障的几段小代码分析,大部分的故障都逃不出这些场景。故障的排查通常都非常耗费精力,而且你得有线上权限。怎样做一些好用的工具,把这些复杂性屏蔽在后面,才是我们所想要的。

183元/吨!全国首单红树林保护碳汇将公开拍卖

2023-09-09 13:57:54

重庆市璧山区2023-09-09 10:12发布高温橙色预警

2023-09-09 12:05:29

国家统计局:CPI环比涨幅略有扩大 PPI环比由降转涨

2023-09-09 10:23:56

一边取经,一边加速,BBA们亮出了新能源“剑锋”

2023-09-09 09:03:37

河岸“会客厅”打造京城新地标

2023-09-09 06:43:58

穿鞋要人伺候,助理跪地举话筒,赚钱用亿计算,谁还在心疼明星?

2023-09-09 02:03:40

福建集中签约50个重大项目 计划总投资1222.8亿元

2023-09-08 22:08:28

乘联会:8月乘用车市场零售达192.0万辆 同比增长2.5%

2023-09-08 18:47:55

特斯拉股价止跌回升,现在还能买么?

2023-09-08 17:48:34

西山科技:截至目前未有主要产品纳入国家或各省市集中带量采购名单

2023-09-08 16:42:45

预付费卡预收余额达50万元应向各区商务部门进行备案

2023-09-08 15:30:16

经济管理类中文核心期刊 经济管理类核心期刊

2023-09-08 14:13:56

万集科技9月8日快速上涨

2023-09-08 12:40:47

家校携手 温暖前行

2023-09-08 11:34:52

豆粕/菜粕:短期延续高位震荡

2023-09-08 10:48:10

湖北城市建设职业技术学院召开产教融合项目论证会

2023-09-08 09:57:09

泸州龙马潭:带电作业保“清凉” “不停电就是最好的服务”

2023-09-01 10:53:29

潘婷删除宋祖儿相关内容 三天前官宣商务代言

2023-09-01 09:31:11

2023暑期档总票房超206亿元 创中国影史多项纪录

2023-09-01 08:06:57

继续看好科技!!

2023-09-01 06:12:55

微信里舍不得删的公众号,值得收藏

2023-09-01 01:45:05

欲比拟微信:马斯克官宣 X 平台即将更新“音频与视频通话”选项

2023-08-31 21:51:23

36氪2023Q2总收入稳健增长,毛利率强势回升至55%,应用AI技术赋能业务增收提效,驱动业绩高质量增长

2023-08-31 20:37:45

巨人网络首次推出中期分红 《月圆之夜》PVP模式今日正式上线

2023-08-31 18:56:49

四川攀枝花可提供博世洗碗机维修服务地址在哪

2023-08-31 17:43:02

俄滨海边疆区屡遭暴雨袭击 经济损失达70亿卢布

2023-08-31 16:34:49

2023年8月31日二氯乙烷价格最新行情预测

2023-08-31 15:24:31

推动标准新高地建设,杨浦新增6个市级标准化试点项目

2023-08-31 14:26:42

开源证券:给予百普赛斯买入评级

2023-08-31 13:08:48

建立“一生一档” 做好分流安置 确保受灾学生如期开学

2023-08-31 11:40:39

警惕借医疗反腐“一杆子打翻一船人”

2023-08-31 10:12:57

治安管理处罚法修订草案首次提请审议,这些看点值得关注

2023-08-31 09:36:22

深圳再赴香港拟发行50亿元离岸地方债 将投向老旧小区改造等

2023-08-31 08:48:34

华生行为主义心理学的优点(行为主义心理学创始人一一约翰

2023-08-31 07:16:13

狗一直叫怎么制止(狗狗一直叫怎么制止)

2023-08-31 04:38:49

在菲律宾马尼拉能买到什么特产带回国内(在菲律宾马尼拉能买到什么特产带回国)

2023-08-30 23:08:15

算力芯片龙头财报续亏坦言与英伟达存在差距

2023-08-30 21:11:25

岁末到家清蒋士铨拼音版(岁末到家清蒋士铨)

2023-08-30 19:51:43

Tims天好中国Q2翻倍增长,营收4.117亿

2023-08-30 18:32:03

8月30日拓维信息(002261)龙虎榜数据:游资作手新一上榜

2023-08-30 17:38:14

卡倍亿:卡倍亿主要生产汽车用线缆缆产品 公司目前尚未开展机器人相关的业务

2023-08-30 16:30:47

塔塔马蒂诺确认莱昂内尔梅西将在职业足球大联盟对阵纳什维尔的国际迈阿密比赛中首发

2023-08-30 15:13:37

鲁梅尼格:德甲冠军+德国杯决赛+欧冠四强,拜仁就是踢了个好赛季

2023-08-30 13:52:27

湖南省青联科技界别开展走进智能制造企业活动

2023-08-30 12:35:33

天虹股份:公司对数据领域的发展持续保持关注,并积极探索适合自身业务的相关发展机会

2023-08-30 11:17:56

led照明工程(关于led照明工程的基本详情介绍)

2023-08-30 10:00:04

抚州市东临新区:公路建设助力乡村振兴

2023-08-30 09:15:47

巧解百姓烦心事

2023-08-30 08:05:03

莫迪波·迈加(关于莫迪波·迈加简述)

2023-08-30 06:17:27

字体字形著作权受法律保护吗?

2023-08-30 01:57:30

库杜斯访问--直觉指引我选择西汉姆

2023-08-29 20:34:41

云南14位考生号是什么 14位考生号是什么

2023-08-29 19:00:26

艾艾精工(603580.SH)发半年度业绩,净利润216万元,同比增长18.47%

2023-08-29 17:35:13

爱威科技:业绩说明会定于9月13日举行

2023-08-29 16:09:58

比亚迪s6发动机ABS故障灯同时亮

2023-08-29 14:49:38

人形机器人产业链中报量产进展好于预期

2023-08-29 13:06:37

欧洲两大股指28日上涨

2023-08-29 11:59:01

万向钱潮:目前为特斯拉间接配套球笼、三销节、转向万向节等产品

2023-08-29 09:33:58

仙桃一区一策改造老旧小区——“改”出新生活 “造”就新活力

2023-08-29 08:47:30

【你好武汉】紧急提醒!@打过科兴疫苗的武汉人

2023-08-29 06:51:55

上海新阳(300236):8月28日北向资金减持22.92万股

2023-08-29 04:14:00

宝宝胃口不好?试试中医调理呗

2023-08-28 22:41:07

上海贵酒鄢克亚:以品牌思维搭建酒企护城河

2023-08-28 19:45:36

仰泳教学视频_仰泳教学

2023-08-28 18:05:29

特斯拉FSD12直播首秀!45分钟仅一次干预

2023-08-28 16:54:28

国林科技:公司半导体系列产品客户验证进展顺利

2023-08-28 15:20:35

印花税减半或让利近千亿 印花税下调释放哪些积极信号?

2023-08-28 12:16:31

超多新特性!外网玩家曝《往日之影》新内容

2023-08-28 10:57:30

新概念英语第一册基础语法:名词性从句

2023-08-28 09:11:21

好看又治愈的背景图蓝色 背景图蓝色

2023-08-28 07:06:08

空调自清洁功能有用什么用(空调自清洁功能有用)

2023-08-28 00:40:31

“体育+文旅”更多“沉睡”体育资源被盘活 带动乡村百姓增收致富

2023-08-27 20:44:13

昊志机电(300503.SZ)发布上半年业绩,净亏损1483.69万元,由盈转亏

2023-08-27 18:48:14

【新机】新机扎堆发布!realme/OPPO/iQOO出招

2023-08-27 16:52:23

日本渔民哭诉核污水入海:国家太愚弄人了

2023-08-27 14:47:57

【强信心 起好步 开新局】三百多家食品餐饮企业云集会展中心

2023-08-27 11:06:27

梦见碗是什么意思

2023-08-27 09:34:06

东方甄选入驻淘宝直播,俞敏洪下了一盘大棋

2023-08-27 07:46:49

莴苣炒肉(关于莴苣炒肉简述)

2023-08-27 03:02:04

激活改善性住房 “认房不认贷”政策标准落地

2023-08-26 22:02:13

2023年注册会计师《公司战略与风险管理》考试考后讨论区开放啦!

2023-08-26 19:19:52

苏州金秋购车补贴申请人数超5000

2023-08-26 17:09:02

江门台山:“骑手义警”帮助走失老人与家人团聚

2023-08-26 15:04:03

记事本在电脑哪个位置(记事本在电脑哪里)

2023-08-26 12:50:47

蜂巢能源351万股权被冻结

2023-08-26 11:03:14

集美区税务局:优惠政策精准达 助企纾困力度大

2023-08-26 08:45:42

和田玉的辨别方法 和田玉的辨别方法有哪些

2023-08-26 06:30:26

乐普医疗(300003.SZ)发布上半年业绩,净利润9.61亿元,下降24.17%

2023-08-26 02:52:47

精选高清动漫壁纸头像推荐(第二百一十一期)

2023-08-25 22:30:55

越秀地产:上半年合同销售金额同比增长71% 有信心超额完成年度目标

2023-08-25 20:48:19

首都体育学院湖北录取分数线 首都体育学院湖北招生人数多少

2023-08-25 19:10:19

大盘迭创新低,下周触底反弹概率偏大!

2023-08-25 17:46:21

种牙也能开“导航”?数字化种植成为缺牙修复新选择

2023-08-25 15:54:59

生源地助学贷款延期办理流程?

2023-08-25 14:41:15

菏泽市开发区佃户屯街道邵楼社区志愿服务队(关于菏泽市开发区佃户屯街道邵楼社区志愿服务队简述)

2023-08-25 13:13:10

旗舰同款!真我GT5搭载Pro-XDR高动态显示:亮度至高提升8倍

2023-08-25 11:34:45

固高科技8月25日盘中跌幅达5%

2023-08-25 10:06:32

受汛情影响地区积极做好秋季开学准备

2023-08-25 09:02:05

振兴“湘”村|无花果开出“幸福花”

2023-08-25 07:34:40

冀凯股份:部分客户年度采购计划滞后等 上半年转亏1600万元–2100万元

2023-08-25 05:19:17