日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java 堆大小_适当的Java堆大小的5个技巧

發(fā)布時(shí)間:2023/12/3 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 堆大小_适当的Java堆大小的5个技巧 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java 堆大小

確定生產(chǎn)系統(tǒng)合適的Java堆大小不是一件容易的事。 在我的Java EE企業(yè)經(jīng)驗(yàn)中,由于Java堆容量和調(diào)整不足,我遇到了多個(gè)性能問題案例。

本文將為您提供5個(gè)技巧,這些技巧可以幫助您確定當(dāng)前或新生產(chǎn)環(huán)境的最佳Java堆大小。 這些技巧中的一些對(duì)于預(yù)防和解決java.lang.OutOfMemoryError問題也非常有用。 包括內(nèi)存泄漏。

請(qǐng)注意,這些技巧旨在“幫助您”確定適當(dāng)?shù)腏ava堆大小。 由于每個(gè)IT環(huán)境都是唯一的,因此您實(shí)際上處于最佳位置,可以精確地確定客戶端環(huán)境所需的Java Heap規(guī)范。 其中一些技巧可能也不適用于非常小的Java獨(dú)立應(yīng)用程序,但是我仍然建議您閱讀整篇文章。
未來的文章將包含有關(guān)如何為您的環(huán)境和應(yīng)用程序選擇適當(dāng)?shù)腏ava VM垃圾收集器類型的提示。

#1 – JVM:您總是擔(dān)心自己不了解的內(nèi)容

您如何期望對(duì)您不了解的內(nèi)容進(jìn)行配置,調(diào)整和故障排除? 您可能永遠(yuǎn)沒有機(jī)會(huì)編寫和改進(jìn)Java VM規(guī)范,但是您仍然可以自由學(xué)習(xí)它的基礎(chǔ),以提高您的知識(shí)和故障排除技能。 有些人可能會(huì)不同意,但是從我的角度來看,認(rèn)為Java程序員不需要了解內(nèi)部JVM內(nèi)存管理的想法是一種幻想。

對(duì)于Java和Java EE初學(xué)者而言,Java堆調(diào)優(yōu)和故障排除尤其是一項(xiàng)挑戰(zhàn)。 在以下典型情況下查找:

–您的客戶端生產(chǎn)環(huán)境經(jīng)常面臨OutOfMemoryError并造成大量業(yè)務(wù)影響。 您的支持團(tuán)隊(duì)承受著解決此問題的壓力
–快速的Google搜索使您可以查找類似問題的示例,現(xiàn)在您相信(并假設(shè))自己面臨相同的問題
–然后,您抓住JVM -Xms和 -Xmx值來自另一個(gè)人的OutOfMemoryError問題案例,希望能快速解決客戶的問題 –然后,繼續(xù)對(duì)您的環(huán)境實(shí)施相同的調(diào)整。 2天后,您意識(shí)到問題仍在發(fā)生(甚至更糟或好一點(diǎn))……斗爭(zhēng)仍在繼續(xù)……

什么地方出了錯(cuò)?

–您首先無法正確理解問題的根本原因
–您可能還沒有從更深層次上正確地了解您的生產(chǎn)環(huán)境(規(guī)格,負(fù)載情況等)。 網(wǎng)絡(luò)搜索是學(xué)習(xí)和共享知識(shí)的好方法,但您必須進(jìn)行自己的盡職調(diào)查和根本原因分析
–您可能還缺少一些有關(guān)JVM及其內(nèi)部?jī)?nèi)存管理的基本知識(shí),從而使您無法將所有點(diǎn)連接在一起

我給您的#1技巧和建議是學(xué)習(xí)和理解JVM的基本原理及其不同的內(nèi)存空間。 這些知識(shí)很關(guān)鍵,因?yàn)樗鼘⑹鼓軌蛳蚩蛻籼岢鲇行Ыㄗh,并正確理解與將來的調(diào)整注意事項(xiàng)相關(guān)的可能影響和風(fēng)險(xiǎn)。 現(xiàn)在,在下面找到有關(guān)Java VM的快速高級(jí)參考指南:

Java VM內(nèi)存最多分為3個(gè)內(nèi)存空間:

  • Java堆 。 適用于所有JVM供應(yīng)商,通常在YoungGen(苗圃)和OldGen(租用)空間之間劃分。
  • PermGen (永久代)。 僅適用于Sun HotSpot VM(PermGen空間將在以后的Java 7或Java 8更新中刪除 )
  • 機(jī)堆 (C-Heap)。 適用于所有JVM供應(yīng)商。

我建議您閱讀以下每篇文章,包括有關(guān)HotSpot Java內(nèi)存管理的Sun白皮書。 我也鼓勵(lì)您下載并查看OpenJDK實(shí)現(xiàn)。

## Sun HotSpot VM http://javaeesupportpatterns.blogspot.com/2011/08/java-heap-space-hotspot-vm.html

## IBM VM http://javaeesupportpatterns.blogspot.com/2012/02/java-heap-space-ibm-vm.html

## Oracle JRockit VM http://javaeesupportpatterns.blogspot.com/2012/02/java-heap-space-jrockit-
vm.html

## Sun(Oracle)– Java內(nèi)存管理白皮書 http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf

## OpenJDK –開源Java實(shí)現(xiàn) http://openjdk.java.net/

如您所見,Java VM內(nèi)存管理比通過–Xmx設(shè)置可能的最大值要復(fù)雜得多。 您必須從各個(gè)角度考慮問題,包括您的本機(jī)和PermGen空間要求以及來自物理主機(jī)的物理內(nèi)存可用性(和CPU內(nèi)核數(shù)量)。

由于Java Heap和本機(jī)Heap處于競(jìng)爭(zhēng)之中,因此對(duì)于32位JVM來說,它尤其棘手。 Java堆越大,本機(jī)堆越小。 嘗試為32位VM(例如.2.5 GB +)設(shè)置較大的堆會(huì)增加本機(jī)OutOfMemoryError的風(fēng)險(xiǎn),具體取決于您的應(yīng)用程序占用空間,線程數(shù)等。64位JVM解決了此問題,但您仍然限于物理資源可用性和垃圾收集開銷(大型GC收集的成本隨大小而增加)。 最重要的是,越大并不總是越好,因此請(qǐng)不要假定您可以在單個(gè)16 GB 64位JVM進(jìn)程上運(yùn)行所有20個(gè)Java EE應(yīng)用程序。

#2 –數(shù)據(jù)和應(yīng)用程序?yàn)橥?#xff1a;查看您的靜態(tài)占用空間要求

您的應(yīng)用程序及其關(guān)聯(lián)數(shù)據(jù)將規(guī)定Java Heap占用空間要求。 靜態(tài)內(nèi)存是指“可預(yù)測(cè)的”內(nèi)存需求,如下所示。

–確定要計(jì)劃部署到單個(gè)JVM進(jìn)程的多少個(gè)不同的應(yīng)用程序,例如EAR文件,WAR文件,JAR文件的數(shù)量。部署到單個(gè)JVM的應(yīng)用程序越多,對(duì)本機(jī)堆的需求就越高
–確定在運(yùn)行時(shí)可能會(huì)加載多少個(gè)Java類; 包括第三方API。 您在運(yùn)行時(shí)加載的類加載器和類越多,對(duì)HotSpot VM PermGen空間和內(nèi)部與JIT相關(guān)的優(yōu)化對(duì)象的需求就越高
–確定數(shù)據(jù)緩存占用空間,例如由應(yīng)用程序(和第三方API)加載的內(nèi)部緩存數(shù)據(jù)結(jié)構(gòu),例如從數(shù)據(jù)庫緩存的數(shù)據(jù),從文件讀取的數(shù)據(jù)等。您使用的數(shù)據(jù)緩存越多,對(duì)Java Heap OldGen的需求就越高空間 –確定允許您的中間件創(chuàng)建的線程數(shù)。 這非常重要,因?yàn)镴ava線程需要足夠的本機(jī)內(nèi)存,否則將引發(fā)OutOfMemoryError。

例如,如果您打算在單個(gè)JVM進(jìn)程上部署10個(gè)單獨(dú)的EAR應(yīng)用程序,而不是2個(gè)或3個(gè),則將需要更多的本機(jī)內(nèi)存和PermGen空間。未序列化到磁盤或數(shù)據(jù)庫的數(shù)據(jù)緩存將需要從磁盤上獲得額外的內(nèi)存。 OldGen空間。

嘗試合理估計(jì)靜態(tài)內(nèi)存占用量。 在進(jìn)行真正的測(cè)量練習(xí)之前,這對(duì)于設(shè)置一些起點(diǎn)JVM容量數(shù)據(jù)非常有用(例如,技巧4)。 對(duì)于32位JVM,我通常不建議Java Heap大小大于2 GB(-Xms2048m,-Xmx2048m),因?yàn)槟枰銐虻膬?nèi)存來存儲(chǔ)PermGen以及Java EE應(yīng)用程序和線程的本機(jī)堆。
評(píng)估非常重要,因?yàn)樵趩蝹€(gè)32位JVM進(jìn)程中部署的應(yīng)用程序過多,很容易導(dǎo)致本機(jī)堆耗盡。 特別是在多線程環(huán)境中。

對(duì)于64位JVM,通常建議每個(gè)Java進(jìn)程3 GB或4 GB的Java堆大小。

#3 –商業(yè)流量設(shè)定規(guī)則:查看您的動(dòng)態(tài)足跡需求

您的業(yè)??務(wù)流量通常會(huì)決定您的動(dòng)態(tài)內(nèi)存占用量。 并發(fā)用戶和請(qǐng)求會(huì)生成JVM GC“心跳”,由于頻繁創(chuàng)建和垃圾回收短期和長(zhǎng)期存在的對(duì)象,您可以從各種監(jiān)視工具中觀察到它們。 從上面的JVM圖表中可以看到,YoungGen與OldGen的典型比率是1:3或33%。

對(duì)于典型的32位JVM,Java Heap大小設(shè)置為2 GB(使用分代和并發(fā)收集器)通常將為YoungGen空間分配500 MB,為OldGen空間分配1.5 GB。

最小化主要GC收集的頻率是獲得最佳性能的關(guān)鍵方面,因此,了解并估計(jì)峰值量期間需要多少內(nèi)存非常重要。

同樣,您的應(yīng)用程序和數(shù)據(jù)類型將決定您需要多少內(nèi)存。 涉及大型和非序列化會(huì)話數(shù)據(jù)的購物車類型的應(yīng)用程序(壽命長(zhǎng)的對(duì)象)通常需要大型Java堆和大量的OldGen空間。 無狀態(tài)和XML處理繁重的應(yīng)用程序(很多短期對(duì)象)需要適當(dāng)?shù)腨oungGen空間,以最大程度地減少主要集合的頻率。
例:

–您要部署5個(gè)EAR應(yīng)用程序(約2000個(gè)Java類)(還包括中間件代碼…)
–您的本機(jī)堆需求估計(jì)為1 GB(必須足夠大以處理線程創(chuàng)建等)–您的PermGen空間估計(jì)為512 MB
–內(nèi)部靜態(tài)數(shù)據(jù)緩存估計(jì)為500 MB –在高峰時(shí)段,您的總預(yù)測(cè)流量為5000個(gè)并發(fā)用戶 –每個(gè)用戶會(huì)話數(shù)據(jù)占用量估計(jì)為500 K –僅會(huì)話數(shù)據(jù)所需的總占用空間為峰值容量以下的2.5 GB

如您所見,根據(jù)這樣的要求,您不可能將所有這些流量發(fā)送到單個(gè)JVM 32位進(jìn)程。 一個(gè)典型的解決方案涉及在幾個(gè)JVM進(jìn)程和/或物理主機(jī)之間分配流量(技巧5)(假設(shè)您有足夠的可用硬件和CPU內(nèi)核)。

但是,對(duì)于此示例,由于對(duì)靜態(tài)內(nèi)存的需求很高,并且從長(zhǎng)遠(yuǎn)來看要確保可擴(kuò)展的環(huán)境,我還建議您使用64位VM,但以Java Heap較小為起點(diǎn),例如3 GB,以最大程度地減少GC成本。 您絕對(duì)希望為OldGen空間留出額外的緩沖區(qū),因此我通常建議在大型采集后最多占用50%的內(nèi)存,以保持Full GC的頻率較低,并為故障轉(zhuǎn)移方案提供足夠的緩沖區(qū)。

在大多數(shù)情況下,除非您需要大量的數(shù)據(jù)緩存以實(shí)現(xiàn)適當(dāng)?shù)男阅?#xff08;這對(duì)于門戶(媒體)繁重的應(yīng)用程序是典型的),否則業(yè)務(wù)流量將占用大部分內(nèi)存。 太多的數(shù)據(jù)緩存會(huì)引發(fā)一個(gè)黃色標(biāo)記,您可能需要早于稍后重新訪問某些設(shè)計(jì)元素。

#4 –不要猜測(cè),要衡量!

此時(shí),您應(yīng)該:

–了解基本的JVM原理和內(nèi)存空間
–對(duì)所有應(yīng)用程序及其特征(大小,類型,動(dòng)態(tài)流量,無狀態(tài)對(duì)象與有狀態(tài)對(duì)象,內(nèi)部?jī)?nèi)存緩存等)有深入的了解和了解。
–對(duì)每個(gè)應(yīng)用程序的業(yè)務(wù)流量(并發(fā)用戶數(shù)等)以及每個(gè)應(yīng)用程序都具有很好的視圖或預(yù)測(cè)–如果需要是否需要64位VM以及從哪個(gè)JVM設(shè)置開始,應(yīng)該有一些想法 –一些想法,如果您需要多個(gè)JVM(中間件)進(jìn)程

但是,等等,您的工作尚未完成。 盡管以上信息至關(guān)重要,并且對(duì)您提出“最佳猜測(cè)” Java Heap設(shè)置非常有用,但它始終是最佳的,建議您通過適當(dāng)?shù)男阅芊治?#xff0c;加載和性能模擬應(yīng)用程序行為并驗(yàn)證Java Heap內(nèi)存需求測(cè)試。

您可以學(xué)習(xí)和利用JProfiler之類的工具(將來的文章將包括有關(guān)JProfiler的教程)。 從我的角度來看,學(xué)習(xí)如何使用事件探查器是正確了解應(yīng)用程序內(nèi)存占用的最佳方法。 我用于現(xiàn)有生產(chǎn)環(huán)境的另一種方法是使用Eclipse MAT工具進(jìn)行堆轉(zhuǎn)儲(chǔ)分析。 堆轉(zhuǎn)儲(chǔ)分析功能非常強(qiáng)大,它使您可以查看和了解Java Heap的整個(gè)內(nèi)存占用量,包括與類加載器相關(guān)的數(shù)據(jù),并且在任何內(nèi)存占用量分析中都必須進(jìn)行此練習(xí)。 特別是內(nèi)存泄漏。

Java分析器和堆轉(zhuǎn)儲(chǔ)分析工具使您能夠了解和驗(yàn)證應(yīng)用程序的內(nèi)存占用量,包括檢測(cè)和解決內(nèi)存泄漏。 負(fù)載和性能測(cè)試也是必須的,因?yàn)檫@將允許您通過模擬預(yù)測(cè)的并發(fā)用戶來驗(yàn)證較早的估計(jì)。 它還將暴露您的應(yīng)用程序瓶頸,并允許您進(jìn)一步微調(diào)JVM設(shè)置。 您可以使用諸如Apache JMeter之類的工具,這些工具非常易于學(xué)習(xí)和使用,也可以探索其他商業(yè)產(chǎn)品。

最后,我經(jīng)常看到Java EE環(huán)境運(yùn)行良好,直到基礎(chǔ)架構(gòu)的一部分開始出現(xiàn)故障(例如硬件故障)為止。 突然,環(huán)境以減少的容量(減少了JVM進(jìn)程的數(shù)量)運(yùn)行,并且整個(gè)環(huán)境崩潰了。 發(fā)生了什么?

有許多情況可能導(dǎo)致多米諾骨牌效應(yīng),但是JVM調(diào)優(yōu)和處理故障轉(zhuǎn)移 (短期額外負(fù)載)的能力非常普遍。 如果您的JVM進(jìn)程以80%+的OldGen空間容量運(yùn)行并且具有頻繁的垃圾回收,那么您如何期望處理任何故障轉(zhuǎn)移方案?

前面執(zhí)行的負(fù)載和性能測(cè)試練習(xí)應(yīng)該模擬這種情況,并且應(yīng)該適當(dāng)?shù)卣{(diào)整調(diào)整設(shè)置,以便Java Heap有足夠的緩沖區(qū)來在短期內(nèi)處理額外的負(fù)載(額外的對(duì)象)。 這主要適用于動(dòng)態(tài)內(nèi)存占用量,因?yàn)楣收限D(zhuǎn)移意味著將一定百分比的并發(fā)用戶重定向到可用的JVM進(jìn)程(中間件實(shí)例)。

#5 –分而治之

此時(shí),您已經(jīng)執(zhí)行了數(shù)十次負(fù)載測(cè)試迭代。 您知道您的JVM不會(huì)泄漏內(nèi)存。 您的應(yīng)用程序內(nèi)存占用空間無法再減少。 您嘗試了幾種調(diào)優(yōu)策略,例如使用10 GB +的大型64位Java堆空間,多個(gè)GC策略,但仍然找不到可接受的性能級(jí)別?

根據(jù)我的經(jīng)驗(yàn),我發(fā)現(xiàn),在當(dāng)前的JVM規(guī)范下,適當(dāng)?shù)拇怪焙退綌U(kuò)展會(huì)涉及為每個(gè)物理主機(jī)以及跨多個(gè)主機(jī)創(chuàng)建幾個(gè)JVM進(jìn)程,從而為您提供所需的吞吐量和容量。 如果您將應(yīng)用程序列表分為幾個(gè)邏輯孤島(具有各自的JVM進(jìn)程,線程和調(diào)整值),則您的IT環(huán)境也將具有更大的容錯(cuò)能力。
這種“分而治之”的策略涉及將您的應(yīng)用程序流量拆分到多個(gè)JVM進(jìn)程,并將為您提供:

–減少了每個(gè)JVM進(jìn)程的Java堆大小(靜態(tài)和動(dòng)態(tài)足跡)
–降低了JVM調(diào)整的復(fù)雜性
–減少了每個(gè)JVM進(jìn)程的GC經(jīng)過和暫停時(shí)間 –增強(qiáng)的冗余和故障轉(zhuǎn)移功能 –與最新的云和IT虛擬化策略保持一致

底線是,當(dāng)您發(fā)現(xiàn)自己花費(fèi)太多時(shí)間來調(diào)整單個(gè)大象的64位JVM進(jìn)程時(shí),該是重新審視中間件和JVM部署策略并利用縱向和橫向擴(kuò)展優(yōu)勢(shì)的時(shí)候了。 這種實(shí)施策略對(duì)硬件的負(fù)擔(dān)更大,但從長(zhǎng)遠(yuǎn)來看確實(shí)會(huì)有所回報(bào)。

請(qǐng)?zhí)峁┤魏卧u(píng)論,并分享您對(duì)JVM Heap調(diào)整大小和調(diào)整的經(jīng)驗(yàn)。

參考: Java EE支持模式和Java教程博客中的JCG合作伙伴 Pierre-Hugues Charbonneau提供了5個(gè)有關(guān)適當(dāng)?shù)腏ava堆大小的技巧 。


翻譯自: https://www.javacodegeeks.com/2012/07/5-tips-for-proper-java-heap-size.html

java 堆大小

總結(jié)

以上是生活随笔為你收集整理的java 堆大小_适当的Java堆大小的5个技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。