Java-List集合堆內存溢出

Java-List集合堆內存溢出

    • 情況一
    • 情況二
    • 對照分析
    • 對照規定堆內存

情況一

往List<Object>的集合中不斷插入元素,集合底層的數組會不斷擴容,從0 -> 10 -> 10 + 10>>1…。最終出現堆內存溢出,是在擴容數組大小的時候。這里的過程會比下面之間add(“1”)出現內存溢出的時間要長,但是容量比其要小。
說明Object的對象創建會占用一定的空間;數組里面存放執行堆的內存地址也是需要占用空間的;GC掃描這些對象所花的時間也長(-XX:+PrintGCDetails -Xms4g -Xmx4g -XX:NewRatio=4,可以看到不斷有GC日志打印,加上jstat -gc pid查詢GC的耗時,以及T線程出現內存溢出時,main線程出現異常等待的時間就是最近一次add觸發GC的時間)。

public static void main(String[] args) {List<Object> list = new ArrayList<>();Thread thread = new Thread(() -> {synchronized (list) {while (true) {list.add(new Object());}}}, "T ");thread.start();try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}Iterator<Object> iterator = list.iterator();while (iterator.hasNext()){if (!thread.isAlive()){System.out.println(list.size());break;}}list.add(new Object());
}

在這里插入圖片描述

在這里插入圖片描述

情況二

public static void main(String[] args) {List<Object> list = new ArrayList<>();Thread thread = new Thread(() -> {synchronized (list) {while (true) {list.add("1");}}}, "T ");thread.start();try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}Iterator<Object> iterator = list.iterator();while (iterator.hasNext()){if (!thread.isAlive()){System.out.println(list.size());break;}}list.add("1");
}

在這里插入圖片描述

在這里插入圖片描述

對照分析

JVM啟動參數:-Xms4g -Xmx4g -XX:NewRatio=4

public static void main(String[] args) {long start = System.currentTimeMillis();List<Object> list = new ArrayList<>();Thread thread = new Thread(() -> {synchronized (list) {while (true) {list.add(new Object());}}}, "T");thread.start();while (true) {if (!thread.isAlive()) {System.out.println(System.currentTimeMillis() - start);System.out.println(list.size());break;}}list.add(new Object());
}

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在指定大小足夠大的情況下時,同樣的啟動參數,為什么GC次數少但是耗時更長?
但是用另外一臺電腦,后者速度會更快一點,為什么?
程序運行久,在后面真正耗時的是GC的時間,耗時75秒,總GC將近74秒。

對照規定堆內存

-XX:+PrintGCDetails -Xms1g -Xmx1g -XX:NewRatio=10 -XX:-UseAdaptiveSizePolicy
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

【應屆應知應會】SQL常用知識點50道

SueWakeup 個人主頁&#xff1a;SueWakeup 系列專欄&#xff1a;借他一雙眼&#xff0c;愿這盛世如先生所愿 個性簽名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陸離 本文封面由 凌七七~? 友情提供 目錄 數據庫的概念 (什么是數據庫) RDBMS NOSQL 數據庫的分類 …

Qt涂鴉板

Qt版本&#xff1a;Qt6 具體代碼&#xff1a; 頭文件 dialog.h #ifndef DIALOG_H #define DIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent n…

0145__contain_of的原理與實現

contain_of的原理與實現_contain of-CSDN博客

從零開始!Jupyter Notebook的安裝教程

引言 Jupyter Notebook作為一種交互式的開發環境&#xff0c;已經成為數據科學和機器學習領域中不可或缺的工具之一。它能夠將代碼、文本、圖像和數據結合在一個靈活的文檔中&#xff0c;使得數據分析和可視化變得更加直觀和高效。 本文將詳細介紹Jupyter Notebook的安裝過程…

深入理解 Git `git add -p` 命令中的交互選項

個人名片 &#x1f393;作者簡介&#xff1a;java領域優質創作者 &#x1f310;個人主頁&#xff1a;碼農阿豪 &#x1f4de;工作室&#xff1a;新空間代碼工作室&#xff08;提供各種軟件服務&#xff09; &#x1f48c;個人郵箱&#xff1a;[2435024119qq.com] &#x1f4f1…

500mA、低壓差、低噪聲、超快、無需旁路電容的CMOS LDO穩壓器RT9013

一般描述 RT9013 SOT23-5封裝的外觀和絲印 RT9013 是一款高性能的 500mA LDO 穩壓器&#xff0c;具有極高的 PSRR 和超低壓差。非常適合具有苛刻性能和空間要求的便攜式射頻和無線應用。 RT9013的靜態電流低至25μA&#xff0c;進一步延長了電池的使用壽命。RT9013 也適用于低…

mysql在部署時的問題

1.遠程連接是否開放問題 DataGrip遠程連接Ubuntu Linux MySQL服務器報錯DBMS: MySQL (no ver.)-CSDN博客 【MySQL】DataGrip遠程連接MySQL_datagrip連接遠程mysql數據庫-CSDN博客 一定要把對應端口規則打開 2.遠程連接不適用3306作為默認運行端口 打開mysql的配置文件&…

音樂發行平臺無加密開源源碼

適用于唱片公司&#xff0c;用于接收物料&#xff0c;下載物料功能&#xff1a;個人或機構認證&#xff0c;上傳專輯和歌曲&#xff0c;版稅結算環境要求php7.4Nginx 1、導入數據庫 2、/inc/conn.php里填寫數據庫密碼等后臺路徑/admin&#xff08;可自行修改任意入口名稱&…

AI在軟件開發中的角色:助手還是取代者?

目錄 前言 一、AI工具現狀&#xff1a;高效助手的崛起 二、AI對開發者的影響&#xff1a;新技能與競爭力的重塑 三、AI開發的未來&#xff1a;共生而非取代 寫在最后 前言 隨著科技的飛速發展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在軟件開發領域的應用日…

【JS】過濾數組中空值——arr.filter(Boolean)

前言&#xff1a;過濾數組中的空值&#xff0c;包括 &#xff08;undefined、null、“”、0、false、NaN&#xff09; Boolean函數可以將一個值轉換為布爾值&#xff0c;空值會被轉換為false&#xff0c;非空值會被轉換為true 方法&#xff1a; const arr [1, 2, ""…

【SQL常用日期函數(一)】

SQL 常用日期函數-基于impala 引擎 當前日期&#xff08;YYYY-MM-DD&#xff09; SELECT CURRENT_DATE(); -- 2024-06-30昨天 SELECT CURRENT_DATE(); -- 2024-06-30 SELECT CAST( DAYS_ADD(TO_DATE( CURRENT_DATE() ), -1 ) AS VARCHAR(10) ); -- 2024-06-29 SELECT CAST( …

Linux-頁表如何對物理內存進行映射

1.1 頁框和頁幀 我們知道通過頁表可以將虛擬內存映射到對應的物理內存&#xff0c;而操作系統對于物理內存的管理并不是以字節為單位的&#xff0c;而是將物理內存分為許多大小為4KB的塊&#xff0c;稱為頁框或頁幀&#xff0c;這就是為什么我們在創建共享內存是建議將大小設定…

LTSPICE仿真電路:(十九)磁珠的一些簡單仿真

1.作用 簡單來說就是用來濾波的&#xff0c;將高頻信號轉化為熱量濾除掉&#xff0c;低頻有用信號正常通過 2.參數 上圖幾個參數比較簡單&#xff0c;就是字面上的意思&#xff0c;更重要的就是頻率阻抗圖 不同曲線代表不同型號的磁珠&#xff0c;實際上除了額定電流外&#…

基于springboot+vue+uniapp的語言課學習系統小程序

開發語言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

藝活網DIY手工制作網站源碼 工藝制作教程平臺源碼,帶數據

帝國CMS仿《手藝活》DIY手工制作網源碼&#xff0c;仿手藝活自適應手機版模板。 帶數據庫和圖片資源&#xff0c;一共5個G大小&#xff0c;下載需耐心。 92開發 手藝活網DIY手工制作網站源碼 創意手工藝品制作教程平臺系統帝國h5自適應手機端 是一套展示各種 DIY 小物品精美又…

@react-google-maps/api實現谷歌地圖中添加多邊圍欄,并可編輯,編輯后可獲得圍欄各個點的經緯度

先上一張效果圖 看看是不是大家想要的效果&#xff5e; ?? 由于該功能微微復雜一點&#xff0c;為了讓大家精準了解 我精簡了一下地圖代碼 大家根據自己的需求將center值和paths&#xff0c;用setState做活就可以了 1.第一步要加入項目package.json中或者直接yarn install它…

[激光原理與應用-97]:激光焊接焊中檢測系統系列介紹 - 1 - 什么是焊接以及傳統的焊接方法

目錄 一、什么是焊接 1.1 概述 1.2 基本原理 二、傳統的焊接技術與方法 2.1 手工電弧焊&#xff1a; 1、定義與原理 2、特點 3、焊條類型 4、應用領域 5、安全注意事項 2.2 氣體保護焊&#xff1a; 1、原理與特點 2、應用領域 3、氣體選擇 4、注意事項 2.3 電阻…

高級IO_多路轉接之Poll

文章目錄 前言一、poll二、poll使用步驟總結 前言 上一章我們學習了select&#xff0c;但是select作為早期的多路轉接接口&#xff0c;缺點十分明顯&#xff0c;于是又出現poll和epoll等接口&#xff0c;今天我們就來學習一下poll的使用 提示&#xff1a;以下是本篇文章正文內…

60種AI工具用法 學會探索AI的無限可能

外面還在賣的課程&#xff0c;學會探索AI的無限可能&#xff0c;從構建精準的提示詞到獲取個性化新聞&#xff0c;從快速制作PPT到短視頻內容的智能提煉&#xff0c;再到編程、股市分析和視頻剪輯&#xff0c;AI工具助您工作學習效率飛躍提升&#xff01; 百度網盤 請輸入提取…

2024 世界人工智能大會暨人工智能全球治理高級別會議全體會議在上海舉辦,推動智能向善造福全人類

2024 年 7 月 4 日&#xff0c;2024 世界人工智能大會暨人工智能全球治理高級別會議-全體會議在上海世博中心舉辦。聯合國以及各國政府代表、專業國際組織代表&#xff0c;全球知名專家、企業家、投資家 1000 余人參加了本次會議&#xff0c;圍繞“以共商促共享&#xff0c;以善…