>
學(xué)校機(jī)構(gòu) >
無錫東方博宜教育培訓(xùn) >
學(xué)習(xí)資訊>
學(xué)JAVA軟件開發(fā)技巧-無錫東方博宜
學(xué)JAVA軟件開發(fā)技巧-無錫東方博宜
98 2017-05-03
5個(gè)優(yōu)化Java堆的技巧
對(duì)于有過Java認(rèn)證經(jīng)歷的人來說,都知道很多性能問題都是由Java堆容量不足和調(diào)優(yōu)引起的,今天無錫東方博宜學(xué)校就和大家一起分享5個(gè)Java堆優(yōu)化的技巧:
學(xué)校地址:無錫市興源北路北創(chuàng)無錫市興源北路401號(hào)一期5樓550
咨詢
1、JVM:對(duì)難以理解的東西產(chǎn)生恐懼感
千萬不要以為,通過配置,調(diào)優(yōu),就可以排除那些你所不明白的問題。有些人認(rèn)為Java程序員不需要知道內(nèi)部JVM內(nèi)存管理。毫無疑問,這種觀點(diǎn)明顯是錯(cuò)誤的,如果想拓寬知識(shí)面和提升排除故障能力,你就必須要了解和學(xué)習(xí)一下JVM內(nèi)存管理。
對(duì)于Java或者是JavaEE新手來說,JavaHeap調(diào)優(yōu)和故障排除是一項(xiàng)非常有挑戰(zhàn)的工作。下面會(huì)提供一些典型的案例場(chǎng)景:
客戶端環(huán)境面臨著有規(guī)律的OutOfMemoryError錯(cuò)誤并且對(duì)業(yè)務(wù)造成了很大的影響。
你的開發(fā)團(tuán)隊(duì)要在如此大的壓力下去解決這個(gè)問題,通常會(huì)怎么做?
1)用谷歌搜索引擎找到類似的問題并且你會(huì)相信(或假設(shè))你也面臨同樣的問題。
2)你會(huì)抓住JVM-Xms和存在OutOfMemoryError異常這幾個(gè)關(guān)鍵字的例子,然后希望通過這樣的案例來快速解決客戶端問題。
3)最后你會(huì)在你環(huán)境中使用相同的調(diào)優(yōu)方法。兩天后,問題仍然發(fā)生(甚至更糟或者稍微好點(diǎn))……
到底是哪里錯(cuò)了呢?
首先,沒有摸清問題根源所在?對(duì)開發(fā)環(huán)境沒有正確地進(jìn)行深層面(規(guī)格、負(fù)載情況等)理解。網(wǎng)絡(luò)搜索是一個(gè)非常優(yōu)秀的學(xué)習(xí)方法和知識(shí)分享工具,但是你必須結(jié)合自己的實(shí)際項(xiàng)目,從根本上進(jìn)行分析解決。
可能缺乏基本的JVM和JVM內(nèi)存管理技能,阻止你把所有的點(diǎn)給連接起來。
今天講的第一條技巧是幫助你理解基本的JVM原則及其與眾不同的內(nèi)存空間。這些知識(shí)都是相當(dāng)重要的,它可以幫助你做出有效的調(diào)優(yōu)策略、更加正確合理的預(yù)測(cè)將來會(huì)產(chǎn)生的影響、提前知道未來需要做哪些調(diào)優(yōu)工作。下面來看一下JVM參考指南:
JVM內(nèi)存分為3個(gè)內(nèi)存空間
●JavaHeap:適用于所有的JVM廠商,通常用來拆分YoungGen(幼苗)和OldGen(終身享用)空間。
●PermGen(永久代):適用于SunHotSpotVM((PermGen空間在Java7或者Java8更新中將會(huì)被刪除)
●NativeHeap(C-Heap):適用于所有的JVM廠商。
正如你所看到的,JVM內(nèi)存管理比使用Xmx設(shè)置最大值更為復(fù)雜。你需要查看每個(gè)角度,包括本地和PermGen需求以及從主機(jī)上查看物理內(nèi)存可用性(CPUcore)。
在較大的JavaHeap和較小的本地Heap比賽中,32位虛擬機(jī)可能會(huì)變得相當(dāng)棘手。試圖在一個(gè)32位VM如2.5GB+上設(shè)置一個(gè)大型堆,根據(jù)應(yīng)用程序占用和線程數(shù)量等因素會(huì)增加OutOfMemoryError這個(gè)異常拋出。64位JVM可以解決這個(gè)問題,但物理資源可用性和垃圾回收成本仍然是有限制的(成本主要集中在GC大小收集上)。最大并不表示是最好的,所以請(qǐng)不要假設(shè)在一個(gè)16GB的64位虛擬機(jī)上可以運(yùn)行20個(gè)JavaEE應(yīng)用程序。
2、數(shù)據(jù)和應(yīng)用程序?yàn)橥酰夯仡欖o態(tài)占用需求
應(yīng)用程序以及相關(guān)數(shù)據(jù)將決定Java堆空間占用需求。通過靜態(tài)內(nèi)存,可"預(yù)測(cè)"下面的內(nèi)存需求:
●確定將會(huì)有多少不同的應(yīng)用程序部署到預(yù)先計(jì)劃的一個(gè)單獨(dú)的JVM進(jìn)程上,例如有多少個(gè)ear文件、war文件、jar文件等。在一個(gè)JVM上部署的應(yīng)用程序越多,對(duì)本機(jī)堆的需求就越多。
●確定有多少個(gè)類需要在運(yùn)行時(shí)加載:包括第三方API.越多的類加載器和類在運(yùn)行時(shí)被加載,在HotSpotVMPermGen空間和內(nèi)部JIT相關(guān)優(yōu)化對(duì)象上的需求就越高。
●確定數(shù)據(jù)緩存占用,如應(yīng)用程序加載內(nèi)部緩存數(shù)據(jù)結(jié)構(gòu)(和第三方API),例如數(shù)據(jù)庫中的數(shù)據(jù)緩存,從文件中讀取數(shù)據(jù)等。數(shù)據(jù)緩存使用越多,JavaHeapOldGen空間需求就越高。
●確定允許建立的中間件線程數(shù)量。這是非常重要的,因?yàn)镴ava線程需要足夠的本機(jī)內(nèi)存,否則會(huì)拋OutOfMemoryError異常。
掃一掃
獲取更多福利
獵學(xué)網(wǎng)企業(yè)微信
獵學(xué)網(wǎng)訂閱號(hào)
獵學(xué)網(wǎng)服務(wù)號(hào)