JVm學習記錄

jvm內存分析 :jvm內存主要有三部分組成:堆,方法區,和棧
一 Java堆
1 堆是jvm中內存管理中最大的一塊,其主要作用是:用於存儲創建好的對象和數組,
2 jvm只有一個堆
3 被所有線程所共享堆是一個不連續的內存空間。
4 堆被劃分爲新生代和老年代。新生代主要存儲新創建的對象和尚未進入老年代的對象。老年代存儲經過多次新生代GC(Minor GC)任然存活的對象。
5 新生代  :程序新創建的對象都是從新生代分配內存,新生代由Eden Space和兩塊相同大小的Survivor Space(通常又稱S0和S1或From和To)構成,可通過-Xmn參數來指定新生代的大小,也可以通過-XX:SurvivorRation來調整Eden Space及Survivor Space的大小。
6 老年代:  用於存放經過多次新生代GC任然存活的對象,例如緩存對象,新建的對象也有可能直接進入老年代,主要有兩種情況:①.大對象,可通過啓動參數設置-XX:PretenureSizeThreshold=1024(單位爲字節,默認爲0)來代表超過多大時就不在新生代分配,而是直接在老年代分配。②.大的數組對象,切數組中無引用外部對象。老年代所佔的內存大小爲-Xmx對應的值減去-Xmn對應的值。
二 Java 棧
1 棧描述的是方法執行的內存模型,每個方法調用都會創建一個棧幀(存儲局部變量,操作數和方法入口等),每個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。
2 虛擬機只會直接對Java棧執行兩種操作:以幀爲單位的壓棧或出棧。當線程調用java方法時,虛擬機壓入一個新的棧幀到該線程的java棧中。當方法返回時,這個棧幀被從java棧中彈出並拋棄。
3 jvm爲每個線程創建一個棧,用於存放該線程執行方法的信息(實際參數,局部變量等)。
4 棧屬於線程私有,不能實現線程之間的共享,棧的存儲特性是先進後出,後進先出,類似於子彈夾。
5 棧是有系統自動分配,並且是一個連續的內存空間
三 方法區
1 jvm只有一個方法區,且被所有線程共享。
2方法區本質也是堆,知識用於存儲類,常量相關的信息,用於存放類中永遠不變或者唯一的內容(類信息class對象,靜態變量,字符串常量)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章