OOM不會導致JVM退出

問題來源

一次生產事故,由于一次性從數據庫查詢過多數據導致線程 OOM:Java heap space 異常(千萬級表,JVM堆內存2G),但是在線程OOM發生時,java進程卻沒有立即掛掉。

##OOM與異常
說到底OutOfMemoryError也只是一個java中的異常而已,屬于Error一系非檢查異常:

ObjectThrowableErrorVirtualMachineErrorOutOfMemoryError

堆內存不夠與異常的關系

線程發生OOM Java heap space,首先是堆空間不夠了,然后再由jvm在申請分配空間的方法調用上拋出OOM異常。
對于線程,它會像處理普通異常一樣,處理OutOfMemoryError。

實例

package org.example;import com.sun.javafx.scene.control.skin.TableHeaderRow;import java.util.ArrayList;//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {public static void main(String[] args) throws InterruptedException{//TIP Press <shortcut actionId="ShowIntentionActions"/> with your caret at the highlighted text// to see how IntelliJ IDEA suggests fixing it.System.out.printf("Hello and welcome!");System.out.println("JVM從OS獲取的 最大 內存" + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "M");System.out.println("JVM從OS獲取的 當前 內存" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "M");System.out.println("JVM從OS獲取的 但空閑 內存" + Runtime.getRuntime().freeMemory() / 1024 / 1024 + "M");// 創建線程new Thread(() -> {ArrayList<byte[]> bytes = new ArrayList<>();for (int i = 0; i < 2000; i++) {byte[] bytes1 = new byte[3 * 1024 * 1024];bytes.add(bytes1);System.out.println(Thread.currentThread().getName()+":JVM從OS獲取的 當前 內存" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "M");}}).start();// 創建線程new Thread(() -> {ArrayList<byte[]> bytes = new ArrayList<>();for (int i = 0; i < 2000; i++) {byte[] bytes1 = new byte[3 * 1024 * 1024];bytes.add(bytes1);System.out.println(Thread.currentThread().getName()+":JVM從OS獲取的 當前 內存" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "M");}}).start();while (true){System.out.println(Thread.currentThread().getName() + " continuing...");Thread.sleep(1000L);}}
}

結果:

##本機64位,16G內存,默認最大堆3600M
JVM從OS獲取的 最大 內存3600M
JVM從OS獲取的 當前 內存243M
JVM從OS獲取的 但空閑 內存237M
main continuing...##2個線程分別開始創建byte數組,占用內存 
Thread-0:JVM從OS獲取的 當前 內存307M
Thread-1:JVM從OS獲取的 當前 內存307M
Thread-1:JVM從OS獲取的 當前 內存307M
Thread-0:JVM從OS獲取的 當前 內存307M##JVM增長到極限,Thread-1先報OOM
Thread-0:JVM從OS獲取的 當前 內存3366M
Thread-0:JVM從OS獲取的 當前 內存3366M
Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap spaceat org.example.Main.lambda$main$1(Main.java:39)at org.example.Main$$Lambda$2/1828972342.run(Unknown Source)at java.lang.Thread.run(Thread.java:750)
Thread-0:JVM從OS獲取的 當前 內存3366M
Thread-0:JVM從OS獲取的 當前 內存3366M#Thread-1失敗終止后,起引用的對象也就可以GC了,Thread-0又獲取了好多內存,直到OOM
Thread-0:JVM從OS獲取的 當前 內存3616M
Thread-0:JVM從OS獲取的 當前 內存3616M
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap spaceat org.example.Main.lambda$main$0(Main.java:29)at org.example.Main$$Lambda$1/1989780873.run(Unknown Source)at java.lang.Thread.run(Thread.java:750)
main continuing...
main continuing...
main continuing...

結論

1、OOM是在線程上發生的,會被當做一般異常處理,不會導致JVM的退出;
2、多線程公用JVM,一個線程終止GC后,內存重新給其他線程分配。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15064.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Android Studio記事本系統

目錄 項目介紹 圖片展示 運行環境 獲取方式 項目介紹 具有登錄&#xff0c;注冊&#xff0c;記住密碼&#xff0c;自動登錄的功能&#xff1b; 可以新增記事本&#xff0c;編輯&#xff0c;刪除記事本信息&#xff0c;同時可以設置主標題&#xff0c;內容&#xff0c;以及…

Ansible自動化運維中的Setup收集模塊應用詳解

作者主頁&#xff1a;點擊&#xff01; Ansible專欄&#xff1a;點擊&#xff01; 創作時間&#xff1a;2024年5月22日13點14分 &#x1f4af;趣站推薦&#x1f4af; 前些天發現了一個巨牛的&#x1f916;人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xf…

服務器沒有圖形界面沒有顯示器怎么辦

可以用vnc。 vnc是開元的。什么是vnc&#xff1f; 使用vnc 下載vnc和vncserver命令。 每生成一個圖形界面就叫做開啟session會話。 vnc相關命令&#xff1a; start a new session: vncserver。 如果沒有會話&#xff0c;一般從:1開始 端口5901 vncserver :2 #指定會話為:2 端…

WinForm+SQL Server+.NET開發菜鳥驛站管理系統

完整效果看嗶哩嗶哩&#xff0c;有需要其他系統&#xff0c;可以私信

Leecode熱題100---55:跳躍游戲(貪心算法)

題目&#xff1a; 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 貪心算…

Spring中的三級緩存和循環依賴

三級緩存 在 Spring 中&#xff0c;Bean 的創建過程涉及到三級緩存。這三級緩存分別是 singletonObjects、earlySingletonObjects 和 singletonFactories。它們在 Spring 容器啟動時用于存儲正在創建的 Bean 實例。 在 Spring 源碼中&#xff0c;三級緩存涉及到了 DefaultSin…

python02 循環與容器

一、if的條件判斷 1-1 if elif else 判斷年齡屬于哪個年齡段 # 判斷學生 core input(請輸入成績) ? if int(core) >90 :print(優秀) elif int(core) >70 and int(core) <90:print(中等) elif int(core) >60 and int(core) <70:print(及格) else:print(不及…

20240521在Ubuntu20.04下編譯RK3588的IPC方案的編譯環境問題makeinfo: not found

20240521在Ubuntu20.04下編譯RK3588的IPC方案的編譯環境問題makeinfo: not found 2024/5/21 20:52 viewproviewpro-ThinkBook-16-G5-IRH:~/RK3588_IPC_SDK$ sudo apt-get install texinfo viewproviewpro-ThinkBook-16-G5-IRH:~$ viewproviewpro-ThinkBook-16-G5-IRH:~$ md5su…

【Basic】Linux Labs

文章目錄 前言一、Linux Labs二、知識點ssh介紹ssh的主要功能SSH的工作原理SSH的常見用法 解題感悟 前言 由于我參加了網絡安全的比賽(被迫)… but我毛都不會&#xff0c;所以我只能臨時抱佛腳… 順便把學習的過程記錄下來&#xff0c;歡迎收看小白0基礎ctf踩坑分享 一、Linux…

【正點原子Linux連載】 第四十六章 M.2硬盤驅動實驗摘自【正點原子】ATK-DLRK3568嵌入式Linux驅動開發指南

1&#xff09;實驗平臺&#xff1a;正點原子ATK-DLRK3568開發板 2&#xff09;平臺購買地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套實驗源碼手冊視頻下載地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

【selenium】自動化測試chrome webdriver驅動下載網址,V123版本以上

Hi&#xff0c;大家好&#xff0c;今天和大家分享下最新的selenium自動化測試&#xff0c;chrome瀏覽器驅動下載的最新地址 chrome webdriver下載網址&#xff0c;適用于瀏覽器版本V123以上

結構型模式 (Python版)

代理模式 from abc import ABC, abstractmethod# 買的行為&#xff08;抽象類&#xff09; class Buy(ABC):abstractmethoddef buy_ticket(self):pass# 男人&#xff08;具體類&#xff09; class Man(Buy):# 男人買票def buy_ticket(self):print("Man 買票成功&#xff…

【輸入示例100,999 輸出示例4】水仙花數

// “水仙花數”是指一個三位正整數&#xff0c;其各位上的數字的立方和等于該數本身。如:1^35^33^3153&#xff0c;因此153是一個水仙花數。輸入兩個三位正整數a和b(其中a<b)&#xff0c;求[a,b]范圍內水仙花數的個數。 //輸入示例100,999 //輸出示例4 #include <stdio.…

AI爆文寫作:如果你有一篇文章爆了,正確的做法是:自己抄襲自己,重復發,還可以繼續爆!

爆款總是相似的&#xff0c;如果你有一篇文章爆了&#xff0c;正確的做法&#xff0c;就是重復發&#xff0c;讓它繼續爆下去。 以前我在小紅書看到一個人&#xff0c;將一篇自己火的筆記&#xff0c;連續發了5次&#xff0c;每次點贊數據都不錯。 公眾號文章也是一樣的。 我…

Gin與OpenAPI(Swagger)的使用

一、背景 1、swagger與openapi Swagger&#xff1a; 一種用于描述RESTFUL API的規范&#xff0c;它提供了一種簡單的來描述API的請求和相應參數、錯誤碼、返回數據類型等信息&#xff0c;是開發者可以方便了解API使用方式。 官網: https://swagger.io/ OpenAPI : 始于 …

gazebo仿真不起飛——QGC地面站查看下是否參數正確

檢查方法&#xff1a;打開QGC地面站查看是否能夠切入定點模式&#xff0c;不能的話查看定位數據來源參數

uniapp(微信小程序)退出小程序方法

一、描述 場景是&#xff1a;當用戶不予授權的時候&#xff0c;不允許使用該小程序&#xff0c;在用戶點擊取消之后&#xff0c;應該關閉當前小程序&#xff0c;不讓他繼續使用。 二、代碼 uni.exitMiniProgram({success: function() {console.log(退出小程序成功);},fail: …

鴻蒙HarmonyOS實戰-Stage模型(信息傳遞載體Want)

&#x1f680;前言 應用中的信息傳遞是為了實現各種功能和交互。信息傳遞可以幫助用戶和應用之間進行有效的溝通和交流。通過信息傳遞&#xff0c;應用可以向用戶傳遞重要的消息、通知和提示&#xff0c;以提供及時的反饋和指導。同時&#xff0c;用戶也可以通過信息傳遞向應用…

FPGA 第4章 攝像頭Bayer轉rgb

參考文獻 彩色MT9V034攝像頭 Bayer轉rgb FPGA實現 https://www.cnblogs.com/hqz68/p/10413896.html 文章目錄 前言Bayer轉rgb算法解析 總結 前言 Bayer格式是相機內部的原始數據, 一般后綴名為.raw。 對于彩色圖像,一般是三原色數據&#xff0c;rgb格式。但是攝像頭一個像素…

【linux-IMX6ULL-LED字符驅動框架完善】

目錄 1.簡介&#xff12;.前置知識2.1 重要函數及結構體2.2 程序框架流程 3. 代碼詳解&#xff1a; 1.簡介 在上節&#xff0c;我對linux-IMX6ULL-字符設備驅動簡單框架實驗進行了說明和構建&#xff0c;但是也存在幾個問題&#xff1b; 需要手動指定設備號&#xff0c;不能自…