jvm內存包括:html
- 程序計數器:
- 是jvm 中較小的一塊內存,每個線程一個計數器。主要保存當前線程執行的虛擬字節碼指令的內存地址,java 多線程,是多個線程之間的輪流切換並分配處理器時間的方式實現的。在任什麼時候刻,處理器只會執行一個線程中的指令。
- 虛擬機棧(java棧):虛擬機棧是和線程緊密相關的,(每建立一個線程就建立一個Java棧, 因此Java棧也是線程私有的內存區域)一個線程就是一個Java棧,一個java棧中有多個棧幀,每調用一個方法的時候就會在Java棧中建立並壓入一個棧幀,棧幀就是用來存儲方法數據和部分過程結果的數據結構, 每個方法從開始調用到最終返回結果的過程,都對應這個棧幀的入棧和出棧的過程。
- 本地方法棧
- 本地方法棧是爲native方法服務的,虛擬機棧是爲java方法服務的。做用和虛擬機棧的做用類似。
- 方法區
- 方法區是用來存儲類結構信息的地方,包含常量池,靜態變量,構造函數等類信息,類信息是由類加載器在加載類的時候會在類文件中提取出來的
- 也有垃圾回收機制,由於用戶經過自定義加載器加載一些類一樣會成爲垃圾,jvm 會回收未被引用的對象,以便方法區的內存最小。
- 還存着常量池,包含一些常量和符號引用(加載類的連接階段中符號引用會被轉換爲直接引用),
- 方法區是線程共享的
- 堆:用來存放對象實例,垃圾回收的主要區域
- java 堆劃分爲兩個不一樣的區域:新生代()young和老年代(old)。
- 新生代又被劃分爲3個區域:Eden, from Survivor,to Survivor,默認的 Eden:from:to = 8:1:1 (能夠經過 -XX SurvivorRatio 參數調節);即Eden=8/10 的新生代的空間大小, from = to = 1/10 的新生代的空間大小。JVM 每次只會使用Eden 和其中一個Survivor 區域爲對象服務,不管什麼時候總有一塊Servivor 是空閒的。因此新生代實際可用的空間只有(9/10)90% 的新生代空間。
- 新生代 和老年代值的比例 1:2(能夠經過調節參數 -XX NewRatio)
- 老年代佔堆大小的 2/3.
- 新生代的Eden 區域用來存放 新建立的對象,2個Survivor用來屢次回收(新生代垃圾回收頻繁) 。
- 新生代中執行的垃圾回收稱之爲 Minor GC (讀音)或者 叫Young GC,中止複製算法,每一次Young GC後留下來的對象age加1。
- 老年代用於存放新生代中通過屢次垃圾回收仍然存活的對象,對象在 Survivor 區每熬過一次 Minor GC,就將對象的年齡 + 1,當對象的年齡達到某個值時 ( 默認是 15 歲,能夠經過參數 -XX:MaxTenuringThreshold 來設定 ),這些對象就會成爲老年代。
- 當老年代被放滿的以後,虛擬機會進行垃圾回收,稱之爲Major GC。因爲Major GC除併發GC外均需對整個堆進行掃描和回收,所以又稱爲Full GC。
- 整個堆大小=年輕代大小 + 老年代大小。堆內存默認爲物理內存的1/64(<1GB);默認空餘堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制,能夠經過MinHeapFreeRatio參數進行調整;默認空餘堆內存大於70%時,JVM會減小堆直到-Xms的最小限制,能夠經過MaxHeapFreeRatio參數進行調整。
-
- 參數比例:
- 最大堆內存 -Xmx:
- 初始時堆內存 -Xms:
- 年輕區內存 -XX MaxNewSize:
- 初始時年輕區內存 -XX NewSize: 一般爲max 的1/3 或 1/4 . 新生代=Eden+2個Survivor空間,實際可用空間Eden+1個Survivor 90%。
- 老年區和新生區比例 -XX NewRatio
- 新生代中Eden和Survivor 的比例 -XX SurvivorRatio
- 最大持久帶內存 -XX:MaxPermSize
- 初始時持久帶內存 -XX:PermSize
- 打印GC 信息 -XX:+printGCDetails
-
-XX:+UseSerialGC:設置串行收集器java
-
-XX:+UseParallelGC:設置並行收集器算法
-
-XX:+UseParalledlOldGC:設置並行年老代收集器數據結構
-
-XX:+UseConcMarkSweepGC:設置併發收集器多線程
- 垃圾回收算法
- 標記-整理(老年代區域使用)
- 分兩個階段,第一個階段從根節點開始標記全部被引用的對象
- 第二個階段遍歷整個堆,清除沒有被標記的對象,壓縮整理使用的對象到一小塊區域
- 複製:將整個內存劃分爲兩個區域,只會使用一個區域,
- 標記-清除:分兩個階段,第一個階段從根節點開始標記全部被引用的對象,第二階段,遍歷整個堆,清除沒有被標記的對象,
- 缺點 內存碎片
- 引用計數:原理是此對象有一個引用,即增長一個計數,刪除一個引用則減小一個計數。垃圾回收時,只用收集計數爲0的對象。此算法最致命的是沒法處理循環引用的問題,在方法區使用。
參考博客:http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html併發