性能優化(JVM概念及配置)

虛擬機組成

一次編寫,處處運行算法

Java虛擬機是對操做系統的模擬,隔離差別編程

2018編程語言排行榜多線程

一個複雜的構架併發

虛擬機的內部概念編程語言

 

運行原理

編譯器,解釋器執行流程工具

內存分配-線程模型spa

棧幀模型操作系統

 

內存管理

內存分配-堆區線程

堆內存分配3d

 

垃圾回收策略

收集器

1.Serial GC。單線程,全部的線程暫停。通常用於Client模式的JVM中。
2.ParNew GC。是在SerialGC的基礎上,增長了多線程機制。
3.Parrallel Scavenge GC。吞吐量優先收集器,吞吐量=程序運行時間/(JVM執行回收的時間+程序運行時間), 運行100分鐘,GC佔用1分鐘,吞吐量=99%。server模式JVM默認配置。
4.ParallelOld。老生代並行收集器的一種,使用了標記整理算法,是JDK1.6中引進的。
5.Serial Old,CMS收集器失敗後的備用收集器。
6.CMS又稱響應時間優先回收器,使用標記清除算法。他的回收線程數爲(CPU核心數+3)/4,因此當CPU核心數爲2時比較高效些。CMS分爲4個過程:初始標記、併發標記、從新標記、併發清除。

肯定垃圾-引用計數法

肯定垃圾-可達性分析

GC算法

1 、標記- 清除(Mark-Sweep )算法

標記- 清除算法將垃圾回收分爲兩個階段:
1.標記階段:首先標記出全部須要回收的對象。
2.清除階段:標記完成後,統一回收被標記的對象
缺點:
3.效率問題:標記清除過程效率都不高。
4.空間問題:標記清除以後會產生大量的不連續的內存碎片( 空間碎片太多可能會致使之後在程序運行過程當中須要分配較大的對象時,沒法找到足夠的連續的內存空間而不得不提早觸發另外一次垃圾收集動做。)

2 、複製(Copying )算法

2.1. 算法思想:
1).將現有的內存空間分爲兩塊,每次只使用一塊.
2).當其中一塊用完的時候,就將還存活的對象複製到另一塊上去。
3).再把已使用過的內存空間一次清理掉。
2.2. 優勢:
1).因爲是每次都對整個半區進行內存回收,內存分配時沒必要考慮內存碎片問題。
2).只要移動堆頂指針,按順序分配內存便可,實現簡單,運行高效。
2.3. 缺點:
1).內存減小爲原來的一半,太浪費了。
2).對象存活率較高的時候就要執行較多的複製操做,效率變低。
3).若是不使用50%的對分策略,老年代須要考慮的空間擔保策略。

 

3 、標記- 整理(Mark-Compact )算法

1).標記階段:首先標記出全部須要回收的對象。與「標記-清除」同樣
2).讓存活的對象向內存的一段移動。而不跟「標記-清除」直接對可回收對象進行清理
3).再清理掉邊界之外的內存。因爲老年代存活率高,沒有額外內存對老年代進行空間擔保,那麼老年代只能採用標記-清理算法或者標記整理算法。

 

4 、分代收集算法

以上三種算法的綜合
在新生代中,每次垃圾收集時都發現有大批對象死去,只有少許存活,選用:複製算法
在老年代中由於對象存活率高、沒有額外空間對它進行分配擔保,就必須使用「標記-清除」或者「標記-整理」算法來進行回收。

 

一些工具

•jps
•jmap
•Jstat
•Jvisualvm: window下啓動遠程監控,並在被
監控服務端,啓動jstatd服務。

-jmap

Mark Sweep Compact GC
Heap Configuration: #堆內存初始化配置
MinHeapFreeRatio = 40 #-XX:MinHeapFreeRatio設置JVM堆最小空閒比率
MaxHeapFreeRatio = 70 #-XX:MaxHeapFreeRatio設置JVM堆最大空閒比率
MaxHeapSize = 100663296 (96.0MB) #-XX:MaxHeapSize=設置JVM堆的最大大小
NewSize = 1048576 (1.0MB) #-XX:NewSize=設置JVM堆的‘新生代’的默認大小
MaxNewSize = 4294901760 (4095.9375MB) #-XX:MaxNewSize=設置JVM堆的‘新生代’的最大大小
OldSize = 4194304 (4.0MB) #-XX:OldSize=設置JVM堆的‘老生代’的大小
NewRatio = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 #-XX:SurvivorRatio=設置年輕代中Eden區與Survivor區的大小比值
PermSize = 12582912 (12.0MB) #-XX:PermSize=<value>:設置JVM堆的‘持久代’的初始大小
MaxPermSize = 67108864 (64.0MB) #-XX:MaxPermSize=<value>:設置JVM堆的‘持久代’的最大大小
Heap Usage:
New Generation (Eden + 1 Survivor Space): #新生代區內存分佈,包含伊甸園區+1個Survivor區
capacity = 30212096 (28.8125MB)
used = 27103784 (25.848182678222656MB)
free = 3108312 (2.9643173217773438MB)
89.71169693092462% used
Eden Space: #Eden區內存分佈
capacity = 26869760 (25.625MB)
used = 26869760 (25.625MB)
free = 0 (0.0MB)
100.0% used

From Space: #其中一個Survivor區的內存分佈
capacity = 3342336 (3.1875MB)
used = 234024 (0.22318267822265625MB)
free = 3108312 (2.9643173217773438MB)
7.001809512867647% used
To Space: #另外一個Survivor區的內存分佈
capacity = 3342336 (3.1875MB)
used = 0 (0.0MB)
free = 3342336 (3.1875MB)
0.0% used
tenured generation: #當前的Old區內存分佈
capacity = 67108864 (64.0MB)
used = 67108816 (63.99995422363281MB)
free = 48 (4.57763671875E-5MB)
99.99992847442627% used
Perm Generation: #當前的 「持久代」 內存分佈
capacity = 14417920 (13.75MB)
used = 14339216 (13.674942016601562MB)
free = 78704 (0.0750579833984375MB)
99.45412375710227% used
相關文章
相關標籤/搜索