Java集合ArrayList、LinkedList、HashMap、HashSet最大容量
1. 堆棧都溢出了,集合再大又有什么用
首先要保證不能棧溢出(StackOverflowError)、內(nèi)存溢出OutOfMemoryError
默認(rèn)最大堆大小1GB,默認(rèn)最大棧大小1MB(只是一個(gè)虛擬機(jī)棧,就是一個(gè)線程,就是一次http請(qǐng)求)
- 32位的JVM上,物理內(nèi)存小于192MB時(shí),為物理內(nèi)存的一半;物理內(nèi)存大于192MB且小于4GB時(shí),為物理內(nèi)存的四分之一;大于等于4GB時(shí),都為1GB
- 64位的JVM上,物理內(nèi)存小于192MB時(shí),為物理內(nèi)存的一半;物理內(nèi)存大192MB且小于128GB時(shí),為物理內(nèi)存的四分之一;大于等于128GB時(shí),都為32GB
比如4G內(nèi)存,默認(rèn)最大堆內(nèi)存是1G
可以通過JVM啟動(dòng)參數(shù)控制:
-Xms設(shè)置堆的最小空間大小。
-Xmx設(shè)置堆的最大空間大小。
-XX:NewSize設(shè)置新生代最小空間大小。
-XX:MaxNewSize設(shè)置新生代最大空間大小。
-XX:PermSize設(shè)置永久代最小空間大小。
-XX:MaxPermSize設(shè)置永久代最大空間大小。
-Xss設(shè)置每個(gè)線程的堆棧大小。
1.1 StackOverflowError觸發(fā)場(chǎng)景
嘰里呱啦
導(dǎo)致StackOverflowError的原因
如上圖,一個(gè)線程開啟一個(gè)虛擬機(jī)棧,虛擬機(jī)棧的大小有限制,默認(rèn)是1024kb=1mb,也就是說一個(gè)線程的最大棧大小是1mb,
而,方法數(shù)對(duì)應(yīng)著棧幀數(shù),棧幀占的內(nèi)存越多,能達(dá)到的最大棧深度也就越小。
java虛擬機(jī)棧是線程私有的,它的生命周期與線程相同。虛擬機(jī)棧描述的是java方法執(zhí)行的線程內(nèi)存模型,每個(gè)方法被執(zhí)行的時(shí)候,java虛擬機(jī)都會(huì)同步創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)連接、方法返回地址等信息。每一個(gè)方法被調(diào)用直至執(zhí)行完畢的過程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)中從入棧到出棧的過程。
每個(gè)線程都有自己的棧,棧中的數(shù)據(jù)都是以棧幀(Stack Frame)的格式存在。
在這個(gè)線程上正在執(zhí)行的每個(gè)方法都各自對(duì)應(yīng)一個(gè)棧幀(Stack Frame)。
棧幀是一個(gè)內(nèi)存區(qū)塊,是一個(gè)數(shù)據(jù)集,維系著方法執(zhí)行過程中的各種數(shù)據(jù)信息。
設(shè)置棧內(nèi)存大小
我們可以使用參數(shù)-Xss選項(xiàng)來設(shè)置線程的最大??臻g,棧的大小直接決定了函數(shù)調(diào)用的最大可達(dá)深度。如果程序使用了很深的遞歸函數(shù),而棧內(nèi)存又非常小,此時(shí)很有可能發(fā)生棧溢出(java.lang.StackOverflowError)的情況。
每一個(gè)線程都有獨(dú)立的棧空間。如果想盡量多跑一些線程的話,就盡量將棧內(nèi)存縮小,而不是增大。
設(shè)置單個(gè)線程棧大小,一般默認(rèn)1024kb。單個(gè)線程棧大小跟操作系統(tǒng)和JDK版本都有關(guān)系 -Xss = -XX:ThreadStackSize。
棧溢出主要在兩點(diǎn):
- 一是棧深度的限制,比如不加約束的遞歸就會(huì)造成棧溢出,一個(gè)方法就是一個(gè)棧幀,棧由棧幀組成,也就是說方法越多,棧的深度越深,那么棧的最大深度到底是多少呢,這個(gè)又由棧幀的大小影響,棧幀越大,棧的最大深度越小。
- 二是棧的內(nèi)存大小不能超過最大棧大小,默認(rèn)是1mb,注意這里是單個(gè)線程的限制
總結(jié):方法小,局部變量小,棧幀就小,棧最大深度就更深,棧幀出棧也就更快,對(duì)象的引用更早消失,對(duì)象更早可能被回收。
1.2 OutOfMemoryError觸發(fā)場(chǎng)景
- 靜態(tài)集合:類在集合就一直在,導(dǎo)致集合中的對(duì)象一直被引用,而不會(huì)像方法中的局部變量一樣,隨著方法運(yùn)行完,棧幀彈出,局部變量消失,對(duì)象失去引用可以對(duì)gc回收,靜態(tài)集合對(duì)應(yīng)的對(duì)象無法回收容易引發(fā)內(nèi)存溢出
2. tomcat都處理不過來了集合再大又有什么用
2.1 tomcat連接配置
SpringBoot開發(fā)最大的好處是簡(jiǎn)化配置,內(nèi)置了Tomcat, 在SpringBoot2.0.x版本中內(nèi)置Tomcat版本是8.5.x,SpringBoot內(nèi)置Tomcat的默認(rèn)設(shè)置中,Tomcat的等待隊(duì)列長(zhǎng)度默認(rèn)是100,Tomcat的最小工作線程數(shù)默認(rèn)分配10,Tomcat的最大線程數(shù)是200,最大連接數(shù)是10000,至于最大并發(fā)量和最大連接數(shù),常常理解成最大并發(fā)量就是最大連接數(shù),實(shí)際上是有些牽強(qiáng)的,最大連接數(shù)并不一定就是最大并發(fā)量。
- 默認(rèn)最大連接數(shù)maxConnections = 10000
- 默認(rèn)隊(duì)列長(zhǎng)度acceptCount = 100
- 默認(rèn)最大工作線程數(shù)maxThreads = 200
- 默認(rèn)最小工作線程數(shù) minSpareThreads = 10
2.2 tomcat報(bào)文大小配置
在application.yml中,可以使用以下配置來設(shè)置響應(yīng)報(bào)文最大值(據(jù)說默認(rèn)是2mb):
server: tomcat: max-http-header-size: 4048576 spring: servlet: multipart: enabled: true max-file-size: 1000MB max-request-size: 1000MB
springboot默認(rèn)請(qǐng)求最大值可以通過配置文件進(jìn)行設(shè)置。在springboot應(yīng)用中,tomcat的默認(rèn)配置文件是spring-configuration-metadata.json,它位于spring-boot-autoconfigure-版本號(hào).jar這個(gè)包下面。在該配置文件中,可以找到關(guān)于tomcat的默認(rèn)配置參數(shù)。
其中,最大連接數(shù)的配置參數(shù)為server.tomcat.max-connections,默認(rèn)值為10000。該參數(shù)表示在任何給定時(shí)間,tomcat服務(wù)器可以接受和處理的最大連接數(shù)。
另外,請(qǐng)求正文的大小的默認(rèn)最大值為2MB,可以通過配置參數(shù)server.tomcat.max-http-form-post-size進(jìn)行設(shè)置。默認(rèn)值為2MB。如果要取消對(duì)請(qǐng)求正文大小的限制,可以將該值設(shè)置為-1。
所以,springboot默認(rèn)請(qǐng)求最大值的配置參數(shù)如下:
最大連接數(shù):server.tomcat.max-connections,默認(rèn)值為10000。
請(qǐng)求正文大小:server.tomcat.max-http-form-post-size,默認(rèn)值為2MB。
3. 終于到正文了,集合到底size最大是多少
ArrayList:底層是數(shù)組,最大size是int的最大值,21億多
LinkedList:底層是雙向鏈表,最大可以無限大
HashMap、HashSet:HashSet的就是HashMap實(shí)現(xiàn)的,底層是數(shù)組、單向鏈表或紅黑樹,這倆最大size一樣,也是int的最大值,21億多
到此這篇關(guān)于Java集合ArrayList、LinkedList、HashMap、HashSet最大容量的文章就介紹到這了,更多相關(guān)Java集合最大容量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java LinkedHashSet集合的底層原理和TreeSet集合
- Java中HashMap和HashSet的高效使用技巧分享
- Java中的Set接口實(shí)現(xiàn)類HashSet和LinkedHashSet詳解
- Java中HashSet、LinkedHashSet和TreeSet區(qū)別詳解
- java的==運(yùn)算符和equals操作詳解
- Java中==和equals()的區(qū)別總結(jié)
- java兩個(gè)integer數(shù)據(jù)判斷相等用==還是equals
- 詳解Java中==和equals()的區(qū)別
- 淺談java字符串比較到底應(yīng)該用==還是equals
- java中的HashSet與 == 和 equals的區(qū)別示例解析
相關(guān)文章
Java操作Mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)的增刪查改功能示例
這篇文章主要介紹了Java操作Mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)的增刪查改功能,結(jié)合完整實(shí)例形式分析了java針對(duì)MongoDB數(shù)據(jù)庫(kù)的連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08springboot項(xiàng)目中出現(xiàn)同名bean異常報(bào)錯(cuò)的解決方法
這篇文章給大家聊聊springboot項(xiàng)目出現(xiàn)同名bean異常報(bào)錯(cuò)如何修復(fù),文中通過代碼示例給大家介紹解決方法非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01RocketMQ producer同步發(fā)送單向發(fā)送源碼解析
這篇文章主要為大家介紹了RocketMQ producer同步發(fā)送單向發(fā)送源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03java 中 System.out.println()和System.out.write()的區(qū)別
這篇文章主要介紹了 java 中 System.out.println()和System.out.write()的區(qū)別.的相關(guān)資料,需要的朋友可以參考下2017-04-04解決nacos啟動(dòng)報(bào)錯(cuò)Server check fail, please che
這篇文章主要介紹了nacos啟動(dòng) Server check fail, please check server localhost ,port 9848 is available的錯(cuò)誤原因以及解決方法,需要的朋友可以參考下2023-09-09SpringBoot集成Swagger2生成接口文檔的方法示例
我們提供Restful接口的時(shí)候,API文檔是尤為的重要,它承載著對(duì)接口的定義,描述等,本文主要介紹了SpringBoot集成Swagger2生成接口文檔的方法示例,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12java實(shí)現(xiàn)簡(jiǎn)單圖片上傳下載功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單圖片上傳下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10