JVM總體結構

JVM內存概念

共享內存區域


ce43e3373a8850f028b8eaede1fcb18.png
存儲new出來的實例化對象,大多數狀況實例化對象會存放在Eden區,當eden區滿了以後字節碼執行引擎會使用minor gc進行垃圾回收(用gc root尋址法等)。
方法區(元空間/永久帶):使用的是物理內存,存放全局的常量,靜態變量,類信息(對象在堆中,方法區中存的依舊是指針)java

線程獨佔內存區域

棧(FILO):先入後出結構
棧幀:每個方法會開闢一個棧幀存儲方法內用到的局部變量、操做數棧、動態連接、方法出口c++

  • 局部變量:僅方法內部使用的變量

main方法中若是有new對象,局部變量表中的對象爲對象在堆中的地址,相似於指針。segmentfault


  • 操做數棧:存儲當前操做的變量,E.x 1+2=3,會將1和2分別壓入操做數棧而後將1和2出棧在CPU緩存中進行加法計算,返回結果3從新壓入到操做數棧,最後將操做數棧中的結果拿出進行賦值,操做數棧則清空

  • 動態連接:存放程序中調用的非靜態方法的內存區位置。E.x user.login() 若是login是非靜態方法,則該線程的棧幀中存儲的動態連接則是login()在方法區(元空間)中對應的內存地址。

  • 方法出口:方法執行結束後返回的上層方法的位置信息

E.x
user.login(){//方法體}
執行結束後返回調用login()方法的位置繼續向下執行。windows

本地方法棧:存放native修飾的方法,由C、C++等語言實現的底層dll文件中的方法,能夠實現java語言調用c++等其餘語言寫的本地方法
程序計數器:每個線程獨有的內存空間,用來存儲下一條運行代碼的位置標識例如彙編代碼4:iLoad_1,其中4即爲位置標識,每執行完一行代碼進行更新。
多線程執行時用來記錄當前線程執行的位置,切換回來時在當前位置繼續執行。緩存

內存分配:

指針碰撞分配方式:內存依序存儲,每次指針向後移動對象大小的空間,指向下一個對象存儲的位置多線程

空閒列表分配方式:可能因爲GC等問題,內存中的對象不是依序排列,其中有空缺的內存空間,該部分空間會以列表方式進行村存儲,後面的對象在列表中找到對應的空閒存儲空間進行使用性能

多線程內存爭搶問題解決方案:CAS 比較並替換-默認、TLAB(thread local allocation buffer) 線程本地緩存 -XX:+/-UseTLAB 參數設置本地緩存大小。spa

內存調優:

windows下可使用jdk自動監控程序:jvisualvm查看內存中各個區域的狀況線程

調優目的:因爲GC會觸發STW機制,因此要儘可能減小GC,能夠適當調整內存的大小分配,以下圖
image.png
方法區若是不設置值,該空間初始大小21M,會自動根據GC回收狀況進行自動擴容,不然會致使頻繁的full GC下降性能
-Xss 棧默認大小爲1M,該配置設置的值是針對單個線程設置的棧空間大小,該值越小,單個線程能夠調用的方法越少,但能夠開啓的線程總量會變多。指針

STW目的:避免檢測垃圾對象時,對象的狀態發生變動,產生對象的錯誤清理。

相關文章
相關標籤/搜索