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
可以通過(guò)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è)線程開(kāi)啟一個(gè)虛擬機(jī)棧,虛擬機(jī)棧的大小有限制,默認(rèn)是1024kb=1mb,也就是說(shuō)一個(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í)行完畢的過(guò)程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)中從入棧到出棧的過(guò)程。
每個(gè)線程都有自己的棧,棧中的數(shù)據(jù)都是以棧幀(Stack Frame)的格式存在。
在這個(gè)線程上正在執(zhí)行的每個(gè)方法都各自對(duì)應(yīng)一個(gè)棧幀(Stack Frame)。
棧幀是一個(gè)內(nèi)存區(qū)塊,是一個(gè)數(shù)據(jù)集,維系著方法執(zhí)行過(guò)程中的各種數(shù)據(jù)信息。
設(shè)置棧內(nèi)存大小
我們可以使用參數(shù)-Xss選項(xiàng)來(lái)設(shè)置線程的最大??臻g,棧的大小直接決定了函數(shù)調(diào)用的最大可達(dá)深度。如果程序使用了很深的遞歸函數(shù),而棧內(nèi)存又非常小,此時(shí)很有可能發(fā)生棧溢出(java.lang.StackOverflowError)的情況。
每一個(gè)線程都有獨(dú)立的??臻g。如果想盡量多跑一些線程的話,就盡量將棧內(nèi)存縮小,而不是增大。
設(shè)置單個(gè)線程棧大小,一般默認(rèn)1024kb。單個(gè)線程棧大小跟操作系統(tǒng)和JDK版本都有關(guān)系 -Xss = -XX:ThreadStackSize。
棧溢出主要在兩點(diǎn):
- 一是棧深度的限制,比如不加約束的遞歸就會(huì)造成棧溢出,一個(gè)方法就是一個(gè)棧幀,棧由棧幀組成,也就是說(shuō)方法越多,棧的深度越深,那么棧的最大深度到底是多少呢,這個(gè)又由棧幀的大小影響,棧幀越大,棧的最大深度越小。
- 二是棧的內(nèi)存大小不能超過(guò)最大棧大小,默認(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ì)象無(wú)法回收容易引發(fā)內(nèi)存溢出
2. tomcat都處理不過(guò)來(lái)了集合再大又有什么用
2.1 tomcat連接配置
SpringBoot開(kāi)發(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中,可以使用以下配置來(lái)設(shè)置響應(yīng)報(bào)文最大值(據(jù)說(shuō)默認(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)求最大值可以通過(guò)配置文件進(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,可以通過(guò)配置參數(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)求正文大?。簊erver.tomcat.max-http-form-post-size,默認(rèn)值為2MB。
3. 終于到正文了,集合到底size最大是多少
ArrayList:底層是數(shù)組,最大size是int的最大值,21億多

LinkedList:底層是雙向鏈表,最大可以無(wú)限大
HashMap、HashSet:HashSet的就是HashMap實(shí)現(xiàn)的,底層是數(shù)組、單向鏈表或紅黑樹(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)文章
IDEA中g(shù)it對(duì)于指定文件進(jìn)行版本控制的全過(guò)程
用戶在IDEA中遇到默認(rèn)提交所有修改的問(wèn)題,通過(guò)配置.gitignore和.git/info/exclude忽略特定文件,并利用vcs.xml指定版本控制范圍,實(shí)現(xiàn)精準(zhǔn)版本管理,本文通過(guò)圖文給大家介紹了IDEA中g(shù)it對(duì)于指定文件進(jìn)行版本控制的全過(guò)程,需要的朋友可以參考下2025-05-05
spring boot使用logback實(shí)現(xiàn)多環(huán)境日志配置詳解
這篇文章主要介紹了spring boot使用logback實(shí)現(xiàn)多環(huán)境日志配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Spring注解驅(qū)動(dòng)之ApplicationListener異步處理事件說(shuō)明
這篇文章主要介紹了Spring注解驅(qū)動(dòng)之ApplicationListener異步處理事件說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Java transient 關(guān)鍵字詳解及實(shí)例代碼
本文章向大家介紹Java transient關(guān)鍵字的使用方法和實(shí)例,包括的知識(shí)點(diǎn)有transient的作用、transient使用小結(jié)、transient使用細(xì)節(jié),需要的朋友可以參考一下2016-12-12
Java中一維二維數(shù)組的靜態(tài)和動(dòng)態(tài)初始化
今天通過(guò)本文給大家分享Java中的數(shù)組,包括一維數(shù)組和二維數(shù)組的靜態(tài)初始化和動(dòng)態(tài)初始化問(wèn)題,感興趣的朋友一起看看吧2017-10-10
關(guān)于spring中單例Bean引用原型Bean產(chǎn)生的問(wèn)題及解決
這篇文章主要介紹了關(guān)于spring中單例Bean引用原型Bean產(chǎn)生的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

