在java中如何使用策略模式 如何正確學會Java虛擬機調(diào)優(yōu)?
如何正確學會Java虛擬機調(diào)優(yōu)?一點小經(jīng)驗祝你好運吧:1)堆運行時數(shù)據(jù)區(qū)域,所有類實例和數(shù)組的內(nèi)存均從此處分配。Java虛擬機正常啟動時創(chuàng)建。對象的堆內(nèi)存由一般稱垃圾回收器的不自動內(nèi)存管理系統(tǒng)回收。堆
如何正確學會Java虛擬機調(diào)優(yōu)?
一點小經(jīng)驗祝你好運吧:
1)堆
運行時數(shù)據(jù)區(qū)域,所有類實例和數(shù)組的內(nèi)存均從此處分配。Java虛擬機正常啟動時創(chuàng)建。對象的堆內(nèi)存由一般稱垃圾回收器的不自動內(nèi)存管理系統(tǒng)回收。
堆由兩部分混編:
其中edenfromspacetospace也叫年青代(young),oldspace叫舊生代.
其中有S1,S0(在JDK的那個軟件工具輸出中會看到),共有指的是Survivorspace,能保存有時候垃圾回收后可以生存的對象.
OldGeneration,通常貯存應(yīng)用程序中生命周期長的活下來對象
垃圾回收通常是對YoungGeneration塊和OldGeneration塊內(nèi)存并且回收,YG單獨放新出現(xiàn)的對象,經(jīng)過幾次回收應(yīng)該還沒回收掉的對象往OG中移動,
對YG通過垃圾回收又叫做什么MinorGC,對OG垃圾回收叫MajorGC,四塊內(nèi)存回收各不相干
2)非堆內(nèi)存
JVM更具一個由所有線程鏈接共享的方法區(qū)。方法區(qū)一類非堆內(nèi)存。它讀取每個類結(jié)構(gòu),如不運行時常數(shù)池、字段和方法數(shù)據(jù),包括方法和構(gòu)造方法的代碼。它是在Java虛擬機起動時創(chuàng)建的。
除此之外方法區(qū)外,Java虛擬機實現(xiàn)方法很有可能要作用于內(nèi)部處理或優(yōu)化的內(nèi)存,這種內(nèi)存確實是非堆內(nèi)存。例如,JIT編譯器不需要內(nèi)存來儲存從Java虛擬機代碼可以轉(zhuǎn)換飛來的本機代碼,進而額外低性能。
Permanent Generation(圖中的PermanentSpace)貯放JVM自己的反射對象,諸如類對象和方法對象
3)回收算法和過程
JVM區(qū)分一種分代回收(generationalcollection)的策略,用較高的頻率對二十來歲的對象(younggeneration)參與掃描和回收,這種叫暗minorcollection,而對老對象(oldgeneration)的檢查回收頻率要低比較多,被稱lionscollection。這樣的話就不必須每次來GC都將內(nèi)存中所有對象都全面檢查一遍。
當一個URL被訪問網(wǎng)絡(luò)時,內(nèi)存申請過程如下:
A.JVM會根本無法為咨詢Java對象在Eden中重新初始化一塊內(nèi)存區(qū)域
B.當Eden空間足夠時,內(nèi)存去申請已經(jīng)結(jié)束。不然到下一步怎么辦
C.JVM企圖釋放在Eden中所有不重新活躍的對象(這屬于什么1或更初級的垃圾回收),釋放后若Eden空間仍然不足以放進去新對象,則趁機將部分Eden中異常活躍對象放入Survivor區(qū)D. Survivor區(qū)被用來另外Eden及OLD的中間相互區(qū)域,當OLD區(qū)空間足夠時,Survivor區(qū)的對象會被移到Old區(qū),否則會被剩余在Survivor區(qū)
E.當OLD區(qū)空間太少時,JVM會在OLD區(qū)并且已經(jīng)的垃圾收集(0級)
F.完全垃圾收集后,若Survivor及OLD區(qū)仍舊沒能儲存時從Eden截圖過去的部分對象,導致JVM根本無法在Eden區(qū)為新對象修改內(nèi)存區(qū)域,則會出現(xiàn)”out ofmemory錯誤”
對象衰老的過程
younggeneration的內(nèi)存,由一塊Eden(伊甸園,很好玩)和幾塊Survivor Space(1.4文檔中稱為semi-space)所構(gòu)成。新創(chuàng)建家族的對象的內(nèi)存都分區(qū)分配自eden。幾塊SurvivorSpace總有會一大塊是閑時的,照相顯影劑copyingcollection的目標空間。Minorcollection的過程就是將eden和在用survivorspace中的活對象內(nèi)容復制到空閑survivorspace中。說白survivor,也就是大部分對象在伊甸園蛇寶寶后,根本不會活但是兩次GC。對象在younggeneration里有過了一定次數(shù)的minorcollection后,年紀大了,是會被移到oldgeneration中,稱作tenuring。(有無僅當survivorspace不足的時候才會將老對象tenuring?目前資料中是沒有可以找到請看)
剩下的內(nèi)存空間不足會觸發(fā)時GC,如eden空間太少了現(xiàn)在就要通過minorcollection,oldgeneration空間太少要接受ti國際邀請賽collection,permanentgeneration空間下降會影響到largeGC。
4下一步這部分解說的是TOMCAT或者其他服務(wù)器又出現(xiàn)如下錯誤時的分析:
1、簡單的方法是:Javaheapspace
解釋:
Heapsize設(shè)置中
JVM堆的設(shè)置是指java程序運行過程中JVM可以不調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動后的時候會手動設(shè)置Heapsize的值,其葉綠里空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。是可以借用JVM需要提供的-Xmn-Xms-Xmx等選項可進行設(shè)置中。Heapsize的大小是YoungGeneration和TenuredGeneraion之和。
提示:在JVM中假如98%的時間是用于GC且用些的Heapsize下降2%的時候?qū)G出此極其信息。
提示:HeapSize大千萬不能超過可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項設(shè)置為不同,而-Xmn為1/4的-Xmx值。
解決方法:
不自動設(shè)置中Heapsize
修改TOMCAT_,在“echoUsingCATALINA_BASE:$CATALINA_BASE”上面組建200元以內(nèi)行:
Java代碼
setJAVA_OPTS%JAVA_OPTS%-server-Xms800m-Xmx800m-XX:MaxNewSize256m
setJAVA_OPTS%JAVA_OPTS%-server-Xms800m-Xmx800m-XX:MaxNewSize256m
或改
在“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入以上行:
JAVA_OPTS$JAVA_OPTS -server -Xms800m-Xmx800m-XX:MaxNewSize256m
2、如果你是是:PermGenspace
原因:
PermGenspace的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存比較多是被JVM存放Class和Meta信息的,Class在被Loader時就會被弄到PermGenspace中,它和貯放類實例(Instance)的Heap區(qū)域完全不同,GC(Garbage Collection)不可能在主程序運行期對PermGen space接受清理,因為如果不是你的應(yīng)用中有很CLASS的話,就很很有可能再次出現(xiàn)PermGenspace錯誤,這種錯誤較常見在web服務(wù)器對JSP并且precompile的時候。如果不是你的WEBAPP下都用了大量的第三方j(luò)ar,其大小最多了jvm默認的大小(4M)這樣的話變會才能產(chǎn)生此錯誤信息了。
解決方法:
1.手動啟動系統(tǒng)設(shè)置MaxPermSize大小
修改TOMCAT_(Linux下為),在Java代碼
“echoUsingCATALINA_BASE:$CATALINA_BASE”上面組建以上行:
setJAVA_OPTS%JAVA_OPTS%-server-XX:PermSize128M-XX:MaxPermSize512m
“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入到以上行:
setJAVA_OPTS%JAVA_OPTS%-server-XX:PermSize128M-XX:MaxPermSize512m
下為:
Java代碼
JAVA_OPTS$JAVA_OPTS-server-XX:PermSize128M-XX:MaxPermSize512m
JAVA_OPTS$JAVA_OPTS-server-XX:PermSize128M-XX:MaxPermSize512m
JVM的默認設(shè)置
堆(heap)(NewsGeneration和OldGeneraion之和)的設(shè)置
數(shù)碼寶貝傳說分配的內(nèi)存由-Xms指定你,默認是物理內(nèi)存的1/64但大于11G。
最大分配的內(nèi)存由-Xmx指定,默認是物理內(nèi)存的1/4但大于11G。
默認空余堆內(nèi)存大于140%時,JVM變會速度變大堆等他-Xmx的大限制,可以由-XX:MinHeapFreeRatio重新指定。
設(shè)置成空余堆內(nèi)存大于170%時,JVM會下降堆等他-Xms的最大值限制,可以不由-XX:MaxHeapFreeRatio重新指定。
服務(wù)器就像設(shè)置中-Xms、-Xmx成比例以盡量減少在每次來GC后決定堆的大小,所以才上面的兩個參數(shù)真沒什么用。
-Xmn設(shè)置younggeneration的heap大小
-XX:MinHeapFreeRatio與-XX:MaxHeapFreeRatio設(shè)置空來內(nèi)存占總內(nèi)存的比例范圍,這兩個參數(shù)會影響GC的頻率和單次GC的耗時。-XX:NewRatio做出決定young與oldgeneration的比例。Younggeneration空間越大,minorcollection頻率越低,可是oldgeneration空間小了,又很可能造成守望先鋒挑戰(zhàn)者系列賽collection頻率減少。-XX:NewSize和-XX:MaxNewSize真接更改了younggeneration的缺省大小和最大大小。
非堆內(nèi)存的設(shè)置
設(shè)置成分配為64M
-XX:PermSize系統(tǒng)設(shè)置最小分配空間,-XX:MaxPermSize系統(tǒng)設(shè)置比較大分配空間。就像把這兩個數(shù)值設(shè)為相同,以增加去申請內(nèi)存空間的時間。
再講解和筆記下,JDK下的一些具體看內(nèi)存管理工具的使用:
欄里點jvm內(nèi)存狀態(tài):
jstat-gcutilpid100020
異常狀況的例子
jstat-gcutilpid100020
S0S1EOPYGC YGCT FGC FGCT GCT
0.000.0099.9982.5153.1124091.205101177250.3937251.598
0.000.0083.4282.5553.1024091.205101187252.6507253.855
0.000.0056.0682.4653.1024101.205101207254.4677255.672
0.000.0032.1182.5553.1024111.205101217256.6737257.877
0.000.0099.9982.5553.1024121.205101237257.0267258.231
0.000.0076.0082.5053.1024121.205101247259.2417260.446
這個數(shù)據(jù)顯示wideGC正常再一次發(fā)生。
正常了情況的例子
S0S1EOPYGC YGCT FGC FGCT GCT
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
參數(shù)含義:
S0:Heap上的Survivorspace0段已在用空間的百分比
S1:Heap上的Survivorspace1段已使用空間的百分比
E:Heap上的Eden space段已在用空間的百分比
O:Heap上的Old space段已不使用空間的百分比
P:Permspace已建議使用空間的百分比
YGC:從程序啟動到采樣時發(fā)生YoungGC的次數(shù)
YGCT:YoungGC所得用時間(單位秒)
FGC:從程序啟動到采樣時發(fā)生fullGC的次數(shù)
FGCT:largeGC所是用時間(單位秒)
GCT:應(yīng)用于垃圾回收的總時間(單位秒)
2Dump出內(nèi)存
2.1得出答案要dump的線程pid
在Linux下,建議使用ps–aux
2.2Dump出內(nèi)存建議使用詳情
是可以通過命令:
jmap-dump:filea.hprofpid
比如:jmap-heap2343,可以看見
AttachingtoprocessID2343,can'twait...
Debuggerattachedsuccessfully.
Servercompilerdetected.
JVMversionnot11.0-b16
usingthread-localobjectallocation.
ParallelGCwith8thread(s)
HeapConfiguration:
MinHeapFreeRatio40
MaxHeapFreeRatio70
MaxHeapSize4294967296(4096.0MB)
NewSize2686976(2.5625MB)
MaxNewSize-65536(-0.0625MB)
OldSize5439488(5.1875MB)
NewRatio2(YG,OG大小比為1:2)
SurvivorRatio8
PermSize21757952(20.75MB)
MaxPermSize 268435456 (256.0MB)
HeapUsage:
PSYoungGeneration
EdenSpace:
capacity1260060672(1201.6875MB)
used64868288(61.86322021484375MB)
go1195192384(1139.8242797851562MB)
5.148028935546367%needed
outsideSpace: capacity 85524480 (81.5625MB)
employed59457648(56.70323181152344MB)
go26066832(24.859268188476562MB)
69.52120375359195%utilized
wantSpace:
capacity85852160(81.875MB)
needed0(0.0MB)
cool85852160(81.875MB)
0.0%utilized
~~~~~~~~~~~~~~~~~~~~~~~~~~這三塊為上面所說的YG大小和可以使用情況
PS Old Generation capacity 2291138560 (2185.0MB)
needed1747845928(1666.8757705688477MB)
cool543292632(518.1242294311523MB)
76.28722062099989%utilized
~~~~~~~~~~~~~~~~~~~~~~~~~~OG大小和使用情況
PS Perm Generation capacity 108265472 (103.25MB)
commonly107650712(102.6637191772461MB)
cool614760(0.5862808227539062MB)
99.43217353728436%employed
jstat
jstat是vm的狀態(tài)監(jiān)控工具,監(jiān)控的內(nèi)容有類加載、正常運行時編譯及GC。
使用時,需加上一欄進程的進程id,和所選參數(shù)。以下祥細介紹各個參數(shù)的意義。
jstat-classpid:顯示加載class的數(shù)量,及所占空間等信息。
jstat-compilerpid:會顯示VM實時動態(tài)編譯的數(shù)量等信息。
jstat-gcpid:這個可以會顯示gc的信息,欄里點gc的次數(shù),及時間。其中之后五項,各是younggc的次數(shù),younggc的時間,largegc的次數(shù),largegc的時間,gc的總時間。
jstat-gccapacity:是可以不顯示,VM內(nèi)存中三代(young,old,perm)對象的使用和電腦資源大小,如:PGCMN會顯示的是小于perm的內(nèi)存建議使用量,PGCMX顯示的是perm的內(nèi)存大可以使用量,PGC是當前新生成氣體的perm內(nèi)存占用量,PC是但前perm內(nèi)存占用量。其他的可以依據(jù)這個以此類推,OC是old內(nèi)純的電腦資源量。
jstat-gcnewpid:future對象的信息。
jstat-gcnewcapacitypid:fifth對象的信息非盈利組織會計占用量。
jstat-gcoldpid:old對象的信息。
jstat-gcoldcapacitypid:old對象的信息教材習題解答電腦資源量。
jstat-gcpermcapacitypid:perm對象的信息及其電腦資源量。
jstat-utilpid:統(tǒng)計gc信息統(tǒng)計。
jstat-printcompilationpid:當前VM想執(zhí)行的信息。
以外以上一個參數(shù)外,還是可以而而且兩個數(shù)字,如:jstat-printcompilation30242506是每250毫秒不打印第二次,最少打印出來6次,還是可以另外-h3每三行會顯示一下標題。
例子:
jstat-gcutilpid100020
S0S1EOPYGC YGCT FGC FGCT GCT
47.490.0064.8246.0847.69208222058.6316822.7342081.365
0.0037.9138.5746.1347.69208232058.6916822.7342081.425這里發(fā)生了什么了第二次YGGC,也就是MinorGC,工程浩大0.06s
46.690.0015.1946.1847.69208242058.7766822.7342081.510
46.690.0074.5946.1847.69208242058.7766822.7342081.510
0.0040.2919.9546.2447.69208252058.8486822.7342081.582
MajorGC換算下來時間:22.734/680.334秒
MinorGC換算下來時間:2058.691/208230.099秒
powerjob優(yōu)缺點?
PowerJob特點:
可以使用簡單?。禾峁┣岸薟eb界面,不能開發(fā)者可視化地成功調(diào)度任務(wù)的管理(增、刪、改、查)、任務(wù)運行狀態(tài)監(jiān)控和運行日志打開系統(tǒng)等功能。
設(shè)置定時策略系統(tǒng)完善:支持什么CRON表達式、且固定頻率、單獨計算網(wǎng)絡(luò)延遲和API四種按時調(diào)度策略。
負責執(zhí)行模式相當豐富:允許單機、廣播、Map、MapReduce四種負責執(zhí)行模式,其中Map/MapReduce處理器能使開發(fā)者聊聊無幾數(shù)行代碼便我得到集群分布式計算的能力。
DAG工作流支持什么:意見免費配置任務(wù)依賴性太強關(guān)系,可視化得對任務(wù)通過編排,同樣還意見上下游任務(wù)間的數(shù)據(jù)傳遞
執(zhí)行器接受廣泛的:意見Spring Bean、內(nèi)置/外置Java類、Shell、Python等處理器,應(yīng)用范圍廣。
運維快捷便利:意見網(wǎng)日志功能,執(zhí)行器有一種的日志也可以在前端控制臺頁面實時顯示,減低debug成本,極高地提高開發(fā)效率。
感情依賴系統(tǒng)精簡:大于僅依賴感關(guān)系型數(shù)據(jù)庫(MySQL/Oracle/MSSQLServer...),擴大依賴感為MongoDB(主要用于存儲文件龐大無比的在線日志)。
高可用高性能:調(diào)度服務(wù)器當經(jīng)過精心設(shè)計,一改其他調(diào)度框架實現(xiàn)數(shù)據(jù)庫鎖的策略,實現(xiàn)程序了無鎖化調(diào)度。布署多個指揮調(diào)度服務(wù)器也可以同樣實現(xiàn)高可用和性能的提升(接受無窮的的水平存儲)。
故障撤回與可以恢復:任務(wù)執(zhí)行失敗后,可據(jù)配置的重試策略成功請重試,只要你執(zhí)行器集群有起碼的計算節(jié)點,任務(wù)就能順利能夠完成。