欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

一個java進程發生了OOM后,該進程或服務一定會被殺死嗎?

林玟書2年前26瀏覽0評論

不一定。

一個線程OOM后,其他線程是可以正常運行的,但是內存泄露之后可能會導致整個程序內存溢出,最終程序不可用。

那么我們下面說一下,一個線程OOM了,為什么其他線程不受影響呢?

要回答這個問題,我們先來回想一下java的內存結構。如下圖所示:

我們知道,多線程的時候,每個線程都擁有一個棧和一個程序計數器。棧和程序計數器用來保存線程的執行歷史和線程的執行狀態,是線程私有的資源。堆是線程共享的,所以理論上一個線程OOM了,其他線程應該受影響才對啊,實際上卻并不是,這是什么原因呢?

有興趣的可以按照我下面的這段代碼自己去跑一下,測試一下這個內存溢出。

然后結合JvisualVM工具,你會看到,在程序內存溢出之后,溢出的內存的線程所占的內存會被快速釋放。如下圖所示

根據上圖,我們可以得出當一個線程拋出OOM異常后,它所占據的內存資源會被快速的釋放掉,從而不會影響其他線程的運行!

另外當一個線程OutOfMemoryError后,如果這個OutOfMemoryError被捕獲,那么catch之后吞掉的話程序還能試著繼續運行。發生OutOfMemoryError之后,只是當前這個線程申請更多的內存的時候不被JVM允許,所以會拋出OutOfMemoryError異常。當拋出OutOfMemoryError異常后,當前這個線程會被退出,它所占的內存會被JVM清理掉。

那么JVM為什么要這么設計呢?

答案是,Java程序通常不是為了適應意外的異常而設計的,OOM之后可能導致應用狀態不一致,建議最好重啟。