成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

七段小代碼,玩轉Java程序常見的崩潰場景!

開發
最近在看RCA(Root Cause Analysis)的東西,不小心發現了yCrash這么個東西。它的幾段問題小代碼寫的非常典型,我們可以稍微看一下,來看看Java應用程序常見的幾個崩潰場景。

Java程序是基于GC的,在啟動初始,就申請了足量的內存池,再加上JIT等編譯器的實時優化,速度并不比直接用C++語言寫的慢。Java語言同時由于反射和可觀測等特點,再加上JFR這種神器,在發生問題的時候比二進制文件更容易找到它的根源。

最近在看RCA(Root Cause Analysis)的東西,不小心發現了yCrash這么個東西。它的幾段問題小代碼寫的非常典型,我們可以稍微看一下,來看看Java應用程序常見的幾個崩潰場景。

1. 堆空間溢出

OOM 一般是內存泄漏引起的,表現在 GC 日志里,一般情況下就是 GC 的時間變長了,而且每次回收的效果都非常一般。GC 后,堆內存的實際占用呈上升趨勢。

下面的代碼是死循環,持續向HashMap里塞數據,由于myMap屬于GCRoots,始終得不到釋放,所以它最終的結果就是OOM。

import java.util.HashMap;
public class OOMDemo {
static HashMap<Object, Object> 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 2022
import 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<Key, Integer> 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來獲取堆棧,就會發現線程處于阻塞狀態。它阻塞在對鎖的獲取上(wating to 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常見故障的幾段小代碼分析,大部分的故障都逃不出這些場景。故障的排查通常都非常耗費精力,而且你得有線上權限。怎樣做一些好用的工具,把這些復雜性屏蔽在后面,才是我們所想要的。

責任編輯:趙寧寧 來源: 小姐姐味道
相關推薦

2015-03-24 14:02:45

程序員

2009-06-30 08:06:28

喬布斯職業生涯

2021-12-27 08:58:28

低代碼開發數據安全

2015-09-25 13:37:02

技巧開始菜單

2013-01-07 10:14:06

JavaJava枚舉

2021-03-10 09:44:20

微信小程序APP

2023-02-07 10:15:29

ChatGPTAI模型

2025-02-10 00:00:00

技巧JavaStreams

2022-09-21 12:46:39

開發JavaScrip代碼

2013-01-14 14:56:33

2025-01-21 08:00:00

限流微服務算法

2017-01-12 10:48:02

互聯網

2018-06-27 18:25:47

前端微信小程序喜馬拉雅

2010-08-26 11:15:47

LinuxICMP后門

2024-05-08 08:18:05

索引失效場景

2016-12-21 15:35:55

微信小程序排除

2022-04-20 12:06:10

漏洞Java應用程序黑客

2015-04-03 09:14:12

軟件定義網絡SDNGartner

2021-03-15 15:18:16

鴻蒙HarmonyOS應用

2022-09-23 09:14:28

JavaScriptES6代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91中文字幕在线观看 | 日韩欧美三级电影 | 中文字幕日韩一区 | 亚洲一区二区在线免费观看 | 欧美在线国产精品 | 日日日操| 国产精品日韩欧美一区二区三区 | 欧美日产国产成人免费图片 | 午夜在线影院 | 欧美 日韩 视频 | 91精品久久久久久久99 | 欧美日日日日bbbbb视频 | 久久网一区二区三区 | 欧美中文在线 | 亚洲人人 | 亚洲精品视频在线观看免费 | 毛片久久久 | www.久久久.com| 成人免费观看男女羞羞视频 | 欧美一区二区三区国产 | 国产美女一区二区三区 | 365夜爽爽欧美性午夜免费视频 | 国产真实乱对白精彩久久小说 | 精品国产欧美一区二区三区成人 | 日日夜夜精品视频 | 成人三级在线播放 | 久久网站黄| 中文字幕一区二区三区在线视频 | 久久久久久久久国产成人免费 | 亚洲成人福利视频 | 黄色国产 | 免费在线观看av网址 | www.99热这里只有精品 | 91精品国产91久久久久久最新 | 国产一区不卡 | 精品在线一区二区 | 伊人在线 | 午夜一区二区三区在线观看 | 欧美日一区二区 | 久久99精品久久久久久 | 伊人导航 |