java線程占多大的內存,占哪里的內存?


說到線程,我們往往想到的是線程安全、線程池,很少會去考慮線程的內存。
那么一個線程占用多大的內存?占用哪里的內存呢?

占多大的內存?

jdk1.4默認的單個線程是占用256k的內存
jdk1.5+默認的單個線程是占用1M的內存
可以通過-Xss參數設定,一般默認就好

占哪里的內存?

這TM還用問?java線程當然是占用jvm的內存啊!(╯‵□′)╯︵┻━┻(手動滑稽)
好,我們做個實驗,用jMeter同時並發調用java里某個接口200次,讓java里增加大約190個線程(tomcat會有駐留線程,我這是10個),看下堆內存的情況:

從圖中看到當線程猛增時,堆內存也猛增,然后堆內存會迅速下降,這是因為堆上new了大量的對象,所以猛增,然后線程執行完后,對象被GC了,所以下降。
上面提到堆內存下降是因為線程執行完了,GC回收了new出來的對象。但從圖中看出,堆內存下降后線程數並沒有下降,這是為什么呢?
用過線程池的都知道,線程執行完后並不會立即銷毀掉,會有一個保活時間,保活時間過了后才會銷毀,so
我用的是jdk1.8,每個線程占用1M內存,如果是占用的堆內存,那堆內存應該會增加190M左右,但從圖中看並沒有,所以線程不是占用的堆內存空間。

實際上,java里每新起一個線程,jvm會向操作系統請求新起一個本地線程,此時操作系統會用空閑的內存空間來分配這個線程。所以java里線程並不會占用
jvm的內存空間,而是會占用操作系統空閑的內存空間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM