每日热闻!七段小代码,玩转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常见故障的几段小代码分析,大部分的故障都逃不出这些场景。故障的排查通常都非常耗费精力,而且你得有线上权限。怎样做一些好用的工具,把这些复杂性屏蔽在后面,才是我们所想要的。

每日热闻!七段小代码,玩转Java程序常见的崩溃场景!

2023-05-07 19:32:52

招商银行法务部门不能协商怎么办?逾期会产生什么后果?_世界速读

2023-05-07 18:08:13

锦州医科大学宿舍怎么走附近住条件样

2023-05-07 17:16:31

南京紫金山海拔多少米(南京紫金山海拔多少米高)

2023-05-07 16:33:43

全球关注:煤气用完,先关火还是先关气?

2023-05-07 15:54:13

天舟六号计划近日择机发射 船箭组合体转运至发射区-环球快看点

2023-05-07 14:54:47

当前观察:黄陂区税务局举办“五四”青年节“朗读者”比赛

2023-05-07 13:36:43

“南京女大学生被害案”主犯洪峤被执行死刑 视点

2023-05-07 12:03:16

世界观点:天舟六号船箭组合体完成转运 潮新闻现场直击

2023-05-07 11:15:22

“王应睐星”命名仪式在沪举行,激励科学家们勇毅前行

2023-05-07 10:54:07

每日热门:80级恶魔术士输出手法及天赋_8 2恶魔术士天赋

2023-05-07 09:59:02

正黑糖(关于正黑糖介绍)-环球实时

2023-05-07 09:14:53

武汉市观赏石协会_关于武汉市观赏石协会简述

2023-05-07 08:08:41

1死5伤 美国又一地发生派对枪击事件|世界报道

2023-05-07 06:52:32

逻辑地址由什么组成_逻辑地址 全球速讯

2023-05-07 04:57:10

断联后产生3感觉,别回头|世界报资讯

2023-05-07 02:16:21

好地段,共94亩!吉安市2宗住宅用地挂牌,楼面价仅..._热头条

2023-05-06 23:26:52

7060 高清 下载 7060手机电影网站下载

2023-05-06 22:10:38

资讯推荐:医学院的康复专业怎么样大里面上海

2023-05-06 21:07:06

宝马撞人案司机不服死刑提起上诉是什么情况 宝马撞人案司机不服死刑提起上诉具体来龙去脉是怎么样

2023-05-06 20:32:00

中国人的故事|皑皑白雪中,这些“冰墩墩”守护着铁路的“生命线”

2023-05-06 19:41:15

南方航空:火红五月,青春向党

2023-05-06 19:02:25

环球观速讯丨交口:王卫平调研乡村旅游示范村创建工作

2023-05-06 18:21:42

当前简讯:基本面软件电脑版下载_基本面

2023-05-06 17:41:45

当前速读:“五一”假期掀消费热 多项数据创新高带动中国经济回暖

2023-05-06 17:09:24

微头条丨可靠股份(301009.SZ):相信2023年随着原材料成本的逐步较低,公司毛利率将逐步回升

2023-05-06 16:26:03

每日关注!干海带怎么泡发清洗_干海带怎么泡发

2023-05-06 15:48:19

“五一”服务暖司乘

2023-05-06 15:32:22

当前讯息:漏绘南海诸岛、钓鱼岛等,东渡海关查获350套“问题地图”

2023-05-06 14:47:10

幻想神域源神殿堂召唤_幻想神域启源女神官网 环球要闻

2023-05-06 14:15:18

死亡组!伊藤美诚要与早田希娜争4强,15岁小将阻击平野美宇_全球热门

2023-05-06 13:38:38

【天天热闻】黄金一百秒2020全集_黄金一百秒在线观看

2023-05-06 12:20:01

天天播报:海关:开展《货物进口证明书(汽车、摩托车)》和《进口机动车辆随车检验单》“两证合一”改革试点

2023-05-06 11:57:01

梧州医保怎么用微信缴费 梧州医保报销这些流程你知道吗 全球热推荐

2023-05-06 11:19:04

万画影城电话 万画影城四季青店影讯

2023-05-06 10:41:36

视点!印尼4月精炼锡出口量同比下降21%

2023-05-06 10:19:21

当前视点!今日时讯:新冠不再构成国际关注突发公卫事件 新冠大流行迎来转折点世卫新决定怎么看权威专家详解

2023-05-06 09:51:36

历经1191天!世卫重磅宣布:新冠疫情不再构成“国际关注的突发公共卫生事件”_精选

2023-05-06 09:14:40

中国化学:5月5日融资净买入5864.54万元,连续3日累计净买入8564.94万元 当前聚焦

2023-05-06 08:25:14

福建漳州大学城一群人持刀斗殴引大量群众围观?警方:是普通打架

2023-05-06 07:48:13

中国声音经济数字化行业数据分析: 66.0%消费者表示看重内容丰富|世界报资讯

2023-05-06 06:01:06

汲取黑土地的文学滋养——评第六辑“野草莓丛书”

2023-05-06 04:51:02

小时候吃的零食小黄桃_小时候吃的零食

2023-05-06 02:46:34

东南枝是什么意思_东南枝是什么|观速讯

2023-05-06 00:41:18

大雪节气吃什么传统食物_大雪节气吃的传统食物简述_天天时讯

2023-05-05 23:03:23

学而思研发面向全球数学爱好者和科研机构的大模型MathGPT 计划于年内推出 全球快资讯

2023-05-05 21:57:47

美国就业和薪资增长加快 凸显劳动力市场韧性 天天速看料

2023-05-05 21:10:18

“五一”假期河南省科技馆忙 孩童争相学知识-环球今头条

2023-05-05 20:18:34

英国国王查尔斯和卡米拉王后迎来爱情故事的高潮:两人明日将一起加冕

2023-05-05 19:57:10

行为心理学读后感_行为心理学 每日快看

2023-05-05 19:18:50

厦门高新人才子女学校发布小学和初中招生通告_全球新资讯

2023-05-05 18:40:49

哪吒汽车CEO张勇:目前没有后排放显示屏的规划

2023-05-05 18:25:15

浙江理工大学:学生手绘社会发展“对比图” 环球微资讯

2023-05-05 18:02:45

要闻速递:国际锐评 | “五一”假期的人气见证中国经济的底气

2023-05-05 17:29:04

世界微速讯:白条抵库有什么危害_白条抵库违反什么规定

2023-05-05 16:51:42

天阳科技拟7000万元增资政务数据科技服务机构数喆数据

2023-05-05 16:33:29

即时看!上海闵行最大旧改小区首批楼机构封顶 首批居民最快将于5月底搬回

2023-05-05 15:59:04

环球热资讯!“五一”假期多个行业消费翻倍增长

2023-05-05 14:45:11

成都大运会MV《年轻的模样》警校生版来了

2023-05-05 14:16:14

480万辆次!嘉兴辖区高速流量创历史新高

2023-05-05 13:36:24

图书市集遍地开花,没逛书节的五一长假是不完整的|今日快讯

2023-05-05 12:49:24

加拿大威胁驱逐我外交人员?中方:若执意挑衅,将奉陪到底

2023-05-05 12:09:34

当前简讯:因为枪支暴力 每25名美国幼儿园儿童中就有一人活不到40岁

2023-05-05 12:06:58

全球要闻:华西证券:给予百济神州买入评级,目标价位206.29元

2023-05-05 11:34:23

晋江市领导开展湖漏溪巡河活动

2023-05-05 11:06:42

先惠技术(688155)盘中异动 股价振幅达7.63% 跌6.94% 报47.2元(05-05) 世界报资讯

2023-05-05 10:32:52

文化遗珠蟒河绝兰碑在山西阳城重现光彩

2023-05-05 10:24:16

环球今热点:常德:“五一”期间全市消防安全形势总体平稳

2023-05-05 10:04:46

夜之摩天楼任务好打吗(夜之摩天楼任务在哪接)|实时焦点

2023-05-05 09:29:49

国家邮政局:全国快递业务量突破400亿件

2023-05-05 09:22:22

梦见父亲出车祸_梦见父亲出车祸是啥意思

2023-05-05 08:39:48

进出口银行深入支持湖北供销 助力企业高质量发展

2023-05-05 08:03:33

从同质竞争到抱团发展 湘鄂赣三省掀起“交换游”热潮

2023-05-05 07:23:38

微软做“金主”,与AMD联手打造新款AI芯片,AMD一度飙涨10%-全球快看

2023-05-05 05:59:14

64岁58天!斯帕莱蒂是意甲最年长冠军教头|全球快看点

2023-05-05 04:54:12

全球要闻:苏文电能(300982):5月4日北向资金减持6800股

2023-05-05 03:32:33

哭泣的情人歌词_哭泣的情人|天天微速讯

2023-05-05 01:01:56

毫无底线!杭州西湖高价打捞手机为自导自演 将依法处理-焦点关注

2023-05-04 23:10:45

热议:炬光科技: 西安炬光科技股份有限公司关于以集中竞价交易方式回购公司股份的进展公告

2023-05-04 21:19:48

新动态:怀孕腹痛正常吗_怀孕初期小腹痛正常吗

2023-05-04 20:51:36

红安:庆五四 共唱《美丽中国》

2023-05-04 19:45:56

【全球独家】增城市旅游景点(增城市旅游景点大全)

2023-05-04 19:17:25

世界微资讯!今晚播出!《奔跑的青春——2023五四青年节特别节目》传递闪闪发光的青春力量

2023-05-04 18:57:50

飞机在线选座选哪个座位最好_飞机在线选座 全球观速讯

2023-05-04 18:18:59

波轮洗衣机清洗剂哪个牌子好_洗衣机清洗剂哪个牌子好 世界报资讯

2023-05-04 18:01:43

2023 年广州中考:第一梯度投档控制线划在 9%

2023-05-04 17:16:29

倩女幽魂手游点修为计算器_倩女幽魂修为计算器-世界最资讯

2023-05-04 17:04:26

在岸人民币兑美元16:30收盘报6.9162,较上一交易日涨122个基点

2023-05-04 16:31:54

index match函数和vlookup的区别_index match函数 全球实时

2023-05-04 16:20:42

天邦食品:光大证券金阳光APP显示公司股票停牌、公司可能被终止上市等事项均为不实信息

2023-05-04 15:50:37

倾注百年北欧匠心,ASKO斩获2023AWE艾普兰多项大奖

2023-05-04 15:22:37

全球今日讯!日本平均工资2022_日本平均工资

2023-05-04 15:01:38

用冒险,标记我们! 《和平精英》“精英冒险俱乐部”成线下潮流冒险集合地! 天天精选

2023-05-04 14:13:55

全球最新:尿酸高吃什么降尿酸快食物_尿酸高吃什么降尿酸

2023-05-04 13:41:57

当前简讯:大唐双龙传粤语剧情_大唐双龙传粤语剧情简介

2023-05-04 13:02:07

焦点速递!5月11日!谷歌I/O开发者大会官宣:将发布五款新品

2023-05-04 12:24:59

​江苏内河最大标准化集装箱专用船舶投运_今亮点

2023-05-04 12:02:29

ETF观察丨美联储加息25个基点美股全线收跌,标普500ETF(513500)跌超1%,机构:美联储最早7月开始降息

2023-05-04 11:40:33

遥望科技(002291)5月4日11点14分触及涨停板

2023-05-04 11:23:23

2023年5月4日福建泉州玖龙纸业废纸收购价格平稳

2023-05-04 11:05:55