新聞中心
作為當前更受歡迎和廣泛使用的開源操作系統(tǒng)之一,Linux平臺下Java虛擬機(JVM)的穩(wěn)定性和性能始終是不可忽視的問題。JVM為Java程序提供的內(nèi)存管理系統(tǒng)使Java應(yīng)用程序的編寫和維護變得非常方便,但隨著程序復雜度的增加,程序?qū)?nèi)存的需求也會不斷增加,進而對JVM的內(nèi)存運行能力提出了更高更復雜的要求。在這里,我們將分享一些如何優(yōu)化Linux下JVM內(nèi)存運行的簡單技巧。

創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、柘榮網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、商城開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為柘榮等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
一、理解JVM內(nèi)存模型
在實現(xiàn)Java應(yīng)用程序時,內(nèi)存管理有以下4個主要部分:堆、方法區(qū)、棧和PC寄存器。同時,JVM還有一個內(nèi)存池用于管理字符串值和其他基本對象。堆是JVM內(nèi)存空間中的更大區(qū)域,被用于存儲所有的對象,而一些線程和對象的局部變量則保存在棧中。 PC寄存器用于存儲當前執(zhí)行的指令地址,而方法區(qū)用于存儲Java類的元信息,比如類名、方法名、字段名稱和字節(jié)碼。 JVM還使用內(nèi)存池來保存字符串值和其他特殊對象。
二、設(shè)置JVM內(nèi)存參數(shù)
JVM內(nèi)存參數(shù)對于應(yīng)用程序的穩(wěn)定性和性能的影響非常顯著,因此手動設(shè)置這些參數(shù)是優(yōu)化Java應(yīng)用程序性能的一個非常有效的方法。以下是一些必須考慮的參數(shù):
1. Xmx參數(shù):指定JVM更大可用內(nèi)存,以字節(jié)數(shù)為單位。我們可以根據(jù)服務(wù)器的硬件配置以及應(yīng)用程序的實際需求來調(diào)整此參數(shù)。也就是說,我們需要為每個應(yīng)用程序定制Xmx的值。
2. Xms參數(shù):指定JVM啟動時使用的內(nèi)存量。通常,我們建議將Xmx和Xms設(shè)置為相同的值。
3. PermSize參數(shù):PermSize參數(shù)用于設(shè)置方法區(qū)的初始內(nèi)存大小。該參數(shù)在Java6及更高版本中不再使用,但在Java5及更低版本中仍可使用。
4. MaxPermSize參數(shù):用于定義JVM更大PermSize的大小。該參數(shù)在Java6及更高版本中不再使用,但在Java5及更低版本中仍可使用。
5. Xss參數(shù):該參數(shù)用于設(shè)置每個線程堆棧的大小。同樣,我們可以根據(jù)應(yīng)用程序的實際需要來確定此值。
三、避免過度使用GC
在Java應(yīng)用程序中,垃圾收集器是一個非常重要的機制。當程序需要清理未使用的內(nèi)存時,垃圾收集器就會開始工作。垃圾收集器會把不再使用的對象從內(nèi)存中刪除,從而使更多的內(nèi)存可用。不過,頻繁的垃圾收導致應(yīng)用程序的性能下降。因此,我們需要采取措施來優(yōu)化內(nèi)存管理,從而減少垃圾收集器的運行次數(shù)。
1. 避免創(chuàng)建過多的短壽命對象
短壽命對象是一種生命周期很短的對象,在大多數(shù)情況下,短壽命對象會很快被垃圾收集器回收。因此,為了避免垃圾收集器的頻繁執(zhí)行,我們可以嘗試減少短壽命對象的創(chuàng)建。
2. 盡可能使用局部變量
如果一個對象只在函數(shù)內(nèi)部使用,我們應(yīng)該盡量將其定義為局部變量。這樣做有兩個好處:
a. 減少了垃圾收集器的負擔,因為這些對象只會被分配在棧上,而不是堆中。
b. 加快了函數(shù)的執(zhí)行速度,因為局部變量在棧上分配,而棧上的分配操作比堆上的分配操作要快得多。
四、Java 8中的內(nèi)存改進
Java 8引入了一些新的內(nèi)存管理特性,如針對G1收集器的JVM堆監(jiān)控API和堆Dump API。這些新特性可以幫助我們更好地診斷程序內(nèi)存使用情況,從而更好地優(yōu)化應(yīng)用程序的性能。
1. G1收集器是Java 8中新引入的垃圾收集器,它采用了一種不同于標記清除(Mark-Sweep)和標記整理(Mark-Compact)的算法,并針對大內(nèi)存設(shè)置做了一些優(yōu)化。
2. JVM堆監(jiān)控API可以讓我們實時監(jiān)控JVM堆的使用情況,以便及時發(fā)現(xiàn)和解決內(nèi)存泄漏等問題。
3. 堆Dump API可以讓我們在程序運行時生成堆Dump文件,用于更加詳細地分析應(yīng)用程序的堆使用情況。
五、其他一些小技巧
除了上述技巧外,我們還可以嘗試以下一些小技巧來優(yōu)化JVM的內(nèi)存使用:
1. 合理地使用緩存
如果某個對象需要頻繁地被使用,我們可以嘗試使用緩存來提高程序的性能。通過緩存,我們可以減少對象的創(chuàng)建次數(shù),從而降低垃圾收集器的工作量。
2. 盡可能使用原始類型
如果可能,我們應(yīng)該盡可能使用原始類型而不是對象類型。原始類型在使用內(nèi)存方面更加高效,因為它們在棧上分配,而不是堆上。這樣可以減少垃圾收集的負擔,從而提高程序的性能。
3. 優(yōu)化代碼邏輯
我們應(yīng)該盡可能地優(yōu)化應(yīng)用程序的代碼邏輯,從而減少內(nèi)存的使用。在實現(xiàn)一些復雜算法時,我們可以嘗試使用一些高效的數(shù)據(jù)結(jié)構(gòu)和算法來優(yōu)化程序的性能。同時,我們還可以嘗試通過減少類的繼承層次以及減少Java反射調(diào)用等方式來減少內(nèi)存的使用。
JVM的內(nèi)存管理對于應(yīng)用程序的性能和穩(wěn)定性至關(guān)重要。通過對以上優(yōu)化技巧的掌握,我們可以更好地管理JVM的內(nèi)存,并優(yōu)化我們的Java應(yīng)用程序的性能。如果你的應(yīng)用程序日益變得復雜,我們建議你盡早優(yōu)化內(nèi)存管理,以確保程序的健康運行。
相關(guān)問題拓展閱讀:
- linux啟動腳本的jvm怎么設(shè)置
linux啟動腳本的jvm怎么設(shè)置
不管是YGC還是Full GC,GC過程中都會對導致程序運行中中斷,正確的選擇不同的GC策略,調(diào)整JVM、GC的參數(shù),可以極大的減少由于GC工作,而導致的程序運行中斷方面的問題,進而適當?shù)奶岣逬ava程序銷正的工作效率。但是調(diào)整GC是以個極為復雜的過程,由于各個程序具備不同的特點,如:web和GUI程序就有很大區(qū)別(Web可以適當?shù)耐nD,但GUI停頓是客戶無法接受的),而且由于跑睜謹在各個機器上的配置不同(主要cup個數(shù),內(nèi)存不同),所以使用的GC種類也會不同(如何選擇見GC種類及如何選擇)。本文將注重介紹JVM、GC的一些重要參數(shù)的設(shè)置來提高系統(tǒng)的性能。
GC性能方面的考慮
對于GC的性能主要有2個方面的指標:吞吐量throughput(工作時間不算gc的時悉斗基間占總的時間比)和暫停pause(gc發(fā)生時app對外顯示的無法響應(yīng))。
1. Total Heap
默認情況下,vm會增加/減少heap大小以維持free space在整個vm中占的比例,這個比例由MinHeapFreeRatio和MaxHeapFreeRatio指定。
一般而言,server端的app會有以下規(guī)則:
對vm分配盡可能多的memory;
將Xms和Xmx設(shè)為一樣的值。如果虛擬機啟動時設(shè)置使用的內(nèi)存比較小,這個時候又需要初始化很多對象,虛擬機就必須重復地增加內(nèi)存。
處理器核數(shù)增加,內(nèi)存也跟著增大。
2. The Young Generation
另外一個對于app流暢性運行影響的因素是young generation的大小。young generation越大,minor collection越少;但是在固定heap size情況下,更大的young generation就意味著小的tenured generation,就意味著更多的major collection(major collection會引發(fā)minor collection)。
NewRatio反映的是young和tenured generation的大小比例。NewSize和MaxNewSize反映的是young generation大小的下限和上限,將這兩個值設(shè)為一樣就固定了young generation的大?。ㄍ琗ms和Xmx設(shè)為一樣)。
如果希望,SurvivorRatio也可以優(yōu)化survivor的大小,不過這對于性能的影響不是很大。SurvivorRatio是eden和survior大小比例。
一般而言,server端的app會有以下規(guī)則:
首先決定能分配給vm的更大的heap size,然后設(shè)定更佳的young generation的大??;
如果heap size固定后,增加young generation的大小意味著減小tenured generation大小。讓tenured generation在任何時候夠大,能夠容納所有l(wèi)ive的data(留10%-20%的空余)。
經(jīng)驗&&規(guī)則
年輕代大小選擇
響應(yīng)時間優(yōu)先的應(yīng)用:盡可能設(shè)大,直到接近系統(tǒng)的更低響應(yīng)時間限制(根據(jù)實際情況選擇).在此種情況下,年輕代收集發(fā)生的頻率也是最小的.同時,減少到達年老代的對象.
吞吐量優(yōu)先的應(yīng)用:盡可能的設(shè)置大,可能到達Gbit的程度.因為對響應(yīng)時間沒有要求,垃圾收集可以并行進行,一般適合8CPU以上的應(yīng)用.
避免設(shè)置過小.當新生代設(shè)置過小時會導致:1.YGC次數(shù)更加頻繁 2.可能導致YGC對象直接進入舊生代,如果此時舊生代滿了,會觸發(fā)FGC.
年老代大小選擇
響應(yīng)時間優(yōu)先的應(yīng)用:年老代使用并發(fā)收集器,所以其大小需要小心設(shè)置,一般要考慮并發(fā)會話率和會話持續(xù)時間等一些參數(shù).如果堆設(shè)置小了,可以會造成內(nèi)存碎 片,高回收頻率以及應(yīng)用暫停而使用傳統(tǒng)的標記清除方式;如果堆大了,則需要較長的收集時間.更優(yōu)化的方案,一般需要參考以下數(shù)據(jù)獲得:
并發(fā)垃圾收集信息、持久代并發(fā)收集次數(shù)、傳統(tǒng)GC信息、花在年輕代和年老代回收上的時間比例。
吞吐量優(yōu)先的應(yīng)用:一般吞吐量優(yōu)先的應(yīng)用都有一個很大的年輕代和一個較小的年老代.原因是,這樣可以盡可能回收掉大部分短期對象,減少中期的對象,而年老代盡存放長期存活對象.
關(guān)于linux jvm 內(nèi)存的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
文章名稱:如何優(yōu)化Linux下JVM內(nèi)存運行?(linuxjvm內(nèi)存)
文章轉(zhuǎn)載:http://fisionsoft.com.cn/article/dppegch.html


咨詢
建站咨詢
