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