日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 缓存清理echo_“kill -9”一时爽,秋后算账泪两行

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 缓存清理echo_“kill -9”一时爽,秋后算账泪两行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原創:小姐姐味道(微信公眾號ID:xjjdog),歡迎分享,轉載請保留出處。任何不保留此聲明的轉載都是抄襲。

kill是殺死的意思,帶有主動的意味。鑒于master、slave這樣的名詞,需要在計算機軟件中進行整改,kill這樣明顯帶有負面信息的單詞,按理說也需要被干掉。

不過,如果把命令名字改了,效果也許會更好。因為在Linux上,kill根本就不是殺死的意思。

它只是想要給進程發送一個信號而已。使用kill -l可以看到長長的信號列表。

對Java程序員來說,用的最多的就是kill -9,我也不知道從哪里來的傳承,碼農們都喜歡這種暴力性的命令--喜歡用鋒利的匕首一擊致命。

但是這種玩法又危險的多,不給進程說話的機會。

大家都知道電視劇里,重要人物臨死的時候,會啰啰嗦嗦說很多話,話說不完是不會死的。無論是武林高手,還是達官貴人,都得交代一些能讓故事情節繼續發展下去的廢話。

《水滸傳》里的“英雄們”,來的就相對直接一些。看的不爽,直接單刀直入切中要害,不允許他人有一丁點的廢話,通常情況下直接嗝屁。

各位使用kill -9的兄弟們,個個都像黑黑的李逵,單純、暴力、不講人情。

SIGKILL

9

Kill signal

結束信號

中國的中庸太極之道,在此蕩然無存。kill -9直接使得優雅關閉這個名詞成了廢物。

何為優雅關閉?其實就像是人的“遺言”,要在死之前,交代一些身后事。

我就常常在想,在我死之前,要把所有的錢花的一分不剩。既不留給后代,也不讓它爛在銀行里。這就需要做很多事。

計算機軟件中,在死之前,要處理的事情也還不少。比如,需要把緩沖區的內容處理完畢,發送出去;微服務節點需要先把自己從注冊中心摘除,才能放心的go die。

大體來說,有下面幾個影響:

請求丟失:內存隊列中等待執行請求丟失

數據丟失:處于內存緩存中數據未持久化到磁盤

文件損壞:正在寫的文件沒有沒有更新完成,導致文件損壞

業務中斷:處理一半的業務被強行中斷,如支付成功了,卻沒有更新到數據庫中

服務未下線:上游服務依然往停止節點發送請求

這些情況下,如果把服務玩壞了,正好被領導撞上,被開是分分鐘的事。

Java應用中處處充斥著這種優雅,靠的是shutdownhook鉤子。就是下面這行代碼:

Runtime

.getRuntime()

.addShutdownHook(

new Thread(() -> System.out.println("Do something in Shutdown Hook")));

有沒有好的辦法?有,用kill -15發送SIGTERM信號即可。

但有時候kill -15并不能殺死進程,這個時候,才是kill -9需要出場的時候。

聽夠了15臨死前說的一些廢話,使用9要它的命。

一般的,需要使用kill -15去嘗試殺死進程。如果過一段時間(比如10秒),進程還沒有停止,kill -9才會出場。

kill的默認信號值,就是15,可以說是很貼心了。但還是有很多人使用9。

我想了半天原因,就是一個字:懶。

kill -15需要多次確認,而kill -9一次完事,多數情況下不會出事。有這提高工作效率的事,何樂而不為呢?

常用的信號,還有SIGQUIT,也就是kill -3。

在Java程序下,kill -3的輸出特別有意思,它直接在stdout上輸出了jstack命令所產生的內容。如果是tomcat,那么輸出就在canalina.out文件里。

如果jstack對你的應用不好使了,或者應用幾乎沒有響應了。使用kill -3是一種曲線救國的方式。

其實是JDK屏蔽了這個信號,對Java來說是一個福利。我們在JDK的文檔中找到相關介紹。

Sun’s JVM catches signals to implement shutdown hooks for abnormal JVM termination. The JVM uses SIGHUP, SIGINT, and SIGTERM to initiate the running of shutdown hooks.

The JVM uses a similar mechanism to implement the pre-1.2 feature of dumping thread stacks for debugging purposes. Sun’s JVM uses SIGQUIT to perform thread dumps.

我這里有一個腳本,能夠接受兩個參數。第一個參數是pid,第二個參數是等待的秒數。

pid=$1

count=$2

n=0

if [ ! -n $count ];then

count=10

fi

while [[ $n -lt $count ]]

do

let "n++"

kill -0 $pid

if [ $? -ne 0 ]

then

echo "program not exist"

break

else

echo "send kill -15 to $pid"

kill -15 $pid

sleep 1

fi

if [[ $n -eq $count ]]

then

echo "kill -9 $pid"

# after 10s , try to send kill -9

kill -9 $pid

fi

done

腳本將持續使用kill -0判斷進程是否存在,然后持續發送kill -15指令。等超過指定的秒數,進程依然存在,則最終發送kill -9命令。

問題是,通常情況下,你還是需要等待上幾秒。自動化機器人不會覺得煩,你會。

所以你還是用kill -9。

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java 缓存清理echo_“kill -9”一时爽,秋后算账泪两行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。