java 內存分配機制

JAVA內存是自動管理的,如果我們不清楚內存的回收機制,容易造成內存泄露和內存不夠用


內存總的來說分爲 方法區和堆棧區

1、方法區

方法區就是放了要加載類的的信息、類中靜態變量、類中定義的final類型的常量、filed信息以及方法信息。

在sun jdk中這個區域對應的是Permanet Generation,稱作持久帶,默認最小值16M,最大值64M,可以通過-XX:PermSize及 -XX:MaxPermSize來指定最小和最大值


2、堆

這個理論是可以定義任意大小。默認值的最小值-Xms是內存的1/64,最大不超過1G

默認值的最大值-Xmx是內存的1/4,最大不超過1G

不過在32位系統上最大就是2G

新創建的對象都在eden中,當超過一定的次數調用轉移到舊生代中,S0/S1就是用來進行內存回收的時候進行數據存放的。當-Xms的剩餘空間小於40%自動增長到Xmx的值,當Xmx有70%的空閒的時候自動的降低到-Xms的值,爲了避免他的自動調整,最好將這兩個設置成一樣的值


3、sun jdk堆的分代

分爲 新生代(eden,S0,S1),舊生代

其中S0,S1的大小相同

新生代中的eden的默認係數是8,如果設置新生代是10M,那麼eden是8M,S0/S1一樣大,各自是1M


可以直接設置對象大小值,直接進入舊生代。


4、本地方法棧,pc寄存器和jvm方法棧

當jvm方法棧內存不足的時候會出現stackoverflowerror

這個可以通過設置-Xss參數設置


5、內存回收

主要是跟蹤收集器,可以分成 複製、標記清除、標記壓縮 三種方式進行內存回收


6、sun jdk可用的gc

新生代可用 串行gc、並行回收gc、並行gc

舊生代可用 串行gc、並行Gc,併發Gc


7、調優相關

核心關注點就是吞吐量優先策略(可以通過-XX:GCTimeRatio=n設置新生代和舊生代大小)和暫停時間優先策略

常規情況下我們不需要調整相關的參數,只需要調整持久帶和堆內存大小即可



發佈了219 篇原創文章 · 獲贊 31 · 訪問量 197萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章