您好,登錄后才能下訂單哦!
這篇文章主要介紹了JVM中Xms和Xmx參數要設置為相同值的原因是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇JVM中Xms和Xmx參數要設置為相同值的原因是什么文章都會有所收獲,下面我們一起來看看吧。
IDEA 的 VM 配置(安裝時默認配置)中有如下的配置:
# custom IntelliJ IDEA VM options -Xms2048m -Xmx2048m
看到 Xms 和 Xmx 的參數設置一樣,是不是稍微有些奇怪?這里就寫篇文章分析一下,JVM 的 Xms 和 Xmx 參數設置為相同的值有什么好處?首先來了解一下相關參數的概念及功能。
在啟動 Java 應用程序時,我們通常可以通過參數Xms
和Xmx
來配置 JVM 的堆信息。不配置雖然會有默認值,但如果受硬件所限或需對 JVM 進行調優,則需要根據情況指定這兩個參數的值。
-Xms:堆內存的最小Heap
值,默認為物理內存的1/64,但小于1G。默認當空余堆內存大于指定閾值時,JVM 會減小heap
的大小到-Xms
指定的大小。
-Xmx:堆內存的最大Heap
值,默認為物理內存的1/4。默認當空余堆內存小于指定閾值時,JVM 會增大Heap
到-Xmx
指定的大小。
常規的JVM參數使用如下:
java -Xms512m -Xmx1g
在這種配置下,JVM 啟動時會分配512M的堆內存空間,隨著程序的執行,所需的堆空間越來越大,則會逐漸增大堆內存空間,直到Xmx
參數指定的堆最大空間1G。
當堆內存使用率降低,則會逐漸減小該內存區域的大小。整個過程看似非常合理,但為什么很多生產環境卻也將兩個值配置為相同的值呢?
當堆內存使用情況變化時,并不是單純的擴大和縮小堆內存就完事了。在此之前還會執行GC(垃圾回收)操作。如果-Xms
起初值設置的比較小,那么就頻繁觸發GC
操作。當GC
操作無法釋放更多內存時,才會進行內存的擴充。
我們都知道GC
操作是需要耗時的,而且Full GC
會引起“Stop the World”,也就是說會引起線程停止,不可避免就會引起性能問題。
面對上面的問題,為了避免在生產環境由于heap
內存擴大或縮小導致應用停頓,降低延遲,同時避免每次垃圾回收完成后JVM 重新分配內存。所以,-Xmx
和-Xms
一般都是設置相等的。
當然,如果生產系統上線前有一段預熱時間的話,也可以不設置相等。對于需要高吞吐量的應用來說,可以不在乎這種停頓,比如一些后臺的應用之類,那么內存可以適當調大一些。(停頓時間越長,吞吐量反而越大),需要根據具體情況權衡。
其實關于在生產環境中把Xms
和Xmx
設為相同值也是 Oracle 官方推薦的。在Xms
的參數描述中有這樣一段話:
Oracle recommends setting the minimum heap size (-Xms)equal to the maximum heap size (-Xmx) to minimize garbage collections.
其實這里還有一個小前提,那就是生產環境往往一臺服務器或一個容器只有一個服務,獨占服務器意味著沒有必要調整 JVM 大小,每次調整反而會加大開銷。只有在多開發環境,比如個人電腦等運行進程比較多時,動態調整JVM才有必要。
其實雖然設置為相同值有很多好處,但也會有一些不足。比如,如果兩個值一樣,會減少 GC 的操作,也意味著只有當 JVM 即將使用完時才會進行回收,此前內存會不停的增長。
并且同一 JDK 的 GC 策略也有很多種,不能一概而論。另外,對于Hotspot
虛擬機,Xms
和Xmx
設置為一樣的,可以減輕伸縮堆大小帶來的壓力。但對于IBM
虛擬機,設置為一樣會增大堆碎片產生的幾率,并且這種負面影響足以抵消前者產生的益處。
關于“JVM中Xms和Xmx參數要設置為相同值的原因是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“JVM中Xms和Xmx參數要設置為相同值的原因是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。