JVM 引數調整對 sortx 的影響
Java虛擬機器引數的配置有時候會對SPL的效能產生很大影響,本文從排序函式sortx的使用出發,探索如何通過優化JVM引數配置來提升效能。對分析過程不感興趣的同學可以直接閱讀結論章節。
1 記憶體構成
如圖,Java虛擬機器的記憶體,也就是常說的堆,主要分為年輕代和年老代兩個部分。年輕代存放生命週期很短的物件,年老代存放長期存活的物件。例如,經過幾次垃圾回收之後,一個物件仍然存活,那麼這個物件就會從年輕代進入年老代。
年輕代又分為3個區:Eden、Survivor 1、Survivor 2(以下簡稱Eden、S1、S2)。Eden存放新物件,S1和S2交替使用,用來存放垃圾回收時存活的物件。
2 回收策略
Java虛擬機器的垃圾回收策略很複雜,這裡我們只關心最影響效能的幾種情況。
Java的垃圾回收分為兩種:Full GC和minor GC,前者是對年老代的回收,一般會很慢,後者是針對年輕代的回收,這個很快。我們調優的目標就是儘量避免頻繁的Full GC。那麼什麼情況會觸發Full GC呢?上面說了,新物件會存放在Eden區,而當Eden區滿了的時候就會觸發minor GC,此時Eden區的垃圾物件會被清除,而存活下來的有用物件則會往S1或S2區複製,從而完成一次回收過程。在這個過程中,如果S1或S2區裝不下Eden裡倖存的物件了,就會把倖存的物件儲存到年老代,而如果年老代也沒有空間了,就會觸發Full GC。
簡述就是,Survivor區裝不下年輕代的倖存物件時,會造成年老代的增長,隨著年老代不斷增長,Full GC必然會被觸發。
3 sortx 時的記憶體使用
我們知道sortx函式有個引數n,n是緩衝區條數,表示每次從遊標中取出來的記錄條數。那麼n取什麼值最合適呢?
顯然n不能取值太大,否則會造成記憶體溢位,根本無法使用。
那麼再不斷嘗試取小點,經過幾次嘗試後,會發現可以用了,不會溢位了。但這時不一定是最優取值,如果n取值佔用的記憶體大於Eden,且正好把年老代佔用的差不多了,則每次取出的資料都會送進年老代,等到下一次取數的時候,就觸發Full GC,而這種頻繁觸發是最耗時的。
所以,從Java的分配和回收策略來看,最理想的情況是,n的取值佔用的記憶體,略小於Eden的大小。這是因為sortx這類運算的特點是“取出即用,用完就扔”,很少有物件會常駐記憶體。
那麼如何知道Eden區的大小然後估算n呢?
4 記憶體分配
在 IDE 的啟動配置裡可以看到,引數 -Xmx 用來指定分配給 java 的堆記憶體的大小。例如 -Xmx10g 就表示分配了 10G 記憶體給 Java。那麼 Java 如何把這 10G 分配給這幾個區呢?
預設的情況下,各區比例大概是這樣的:
年輕代 : 年老代 = 3 : 7
Eden : S1 : S2 = 8 : 1 : 1
有了比例,很容易算出來各區大小,年老代佔 7G,年輕代佔 3G,其中 Eden 佔 2.4G,S1 和 S2 各佔 0.3G。據說這個預設比例是 jdk 的開發人員統計得出的,認為在大部分應用中,倖存物件佔全部物件的 1/10。然而這個比例不一定適合所有情形,至少在 sortx 時就不太合適。
5 結論
n的取值原則:使用 sortx 時,在不溢位的前提下,n 的取值並不是越大越好,而是(根據 Eden 大小)估算一個合適值,這個值不引起頻繁 Full GC。
驗證 n 值是否合適的辦法如下:
1 新增引數 -XX:+PrintGC。
2 執行 sortx。
3 觀察控制檯,如果頻繁出現 [Full GC (Allocation Failure)……] 資訊則調小 n,重試。
4 如果只出現很多 [GC (Allocation Failure)……] 資訊,則認為 n 的值是合適的。
5 如果出現很多 [GC (Allocation Failure)……] 資訊的同時,偶爾出現 [Full GC (Allocation Failure)……] 資訊,則也可以認為 n 的值是合適的。
6 確保臨時檔案不能太小。
6 調參
一般來說通過調整n,就基本可以滿足sortx的效能了,如果還想進一步追求效能,就需要調參了。預設分配的年輕代只佔堆的3/10,而年老代那7/10的記憶體在sortx這種計算時顯得作用不大。如果想調整這個比例,又允許sortx使用一個專門的啟動配置,則可以使用引數-XX:NewSize進行調整。
例如,-XX:NewSize=5g,就指定年輕代的大小是5G。
提示一下,調整的時候,年老代的空間也不能留的太少,佔整個堆的1/5是合適的。這是因為Java的分配策略還有很多複雜情況,比如總空間夠但不連續時,仍會直接把物件裝入年老代。類似的情況還有一些,不再贅述。
同樣地,Eden和S1、S2的比例也會影響效能,如果想調整這個比例也可以使用引數-XX:SurvivorRatio。例如-XX:SurvivorRatio=1表示Eden:S1:S2 = 1:1:1。-XX:SurvivorRatio=8表示Eden:S1:S2 = 8:1:1。
一般來說,Survivor區越大,物件進入老年代的概率就越小,所以在做sortx時,傾向於配置為-XX:SurvivorRatio=1。
7 其它
引數的配置沒有一致的準則,需要根據計算的型別來調整,有時候年老代大一些好(比如大維表需要常駐記憶體的),有時候則是年輕代大一些好。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543054/viewspace-2662047/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 淺談JVM整體架構與調優引數JVM架構
- Wenet分散式訓練對學習率調整的影響分散式
- JVM 引數調優(qbit)JVM
- JVM常用調優引數JVM
- Kafka之acks引數對訊息持久化的影響Kafka持久化
- 檢視JVM預設引數及微調JVM啟動引數JVM
- 谷歌也要調整隱私政策,或對數字廣告行業產生重大影響谷歌行業
- 常用的 jvm 調優的引數都有哪些JVM
- MySQL:slave_skip_errors引數對MGR可用性的影響MySqlError
- 瞭解 ignore_above 引數對 Elasticsearch 中磁碟使用的影響Elasticsearch
- swoole優化核心引數調整優化
- Java教程:影響MySQL效能的配置引數JavaMySql
- PostgreSQL安裝完成後,引數調整SQL
- 2024年AI對工作場所的影響調查AI
- solaris記憶體引數調整及管理記憶體
- 達夢資料庫引數調整方法資料庫
- JVM調優引數、方法、工具以及案例總結JVM
- 數字化轉型的影響是什麼?數字化轉型對企業的影響?
- solaris10中安裝oracle核心引數的調整Oracle
- docker下的spark叢集,調整引數榨乾硬體DockerSpark
- dg庫日誌應用慢引數調整
- JPEG的量化引數QP如何影響壓縮質量
- Cox Business:2024年AI對小型企業的影響調查AI
- NewsCred:冠狀病毒對營銷團隊的影響調查
- 常用JVM引數JVM
- 常用的jvm配置引數 :永久區引數配置JVM
- 引數fast_start_parallel_rollback調整oracle回滾的速度ASTParallelOracle
- 1.迭代次數對精確度的影響
- MySQL:Innodb:innodb_flush_log_at_trx_commit引數影響的位置MySqlMIT
- 自動編碼器Gridsearch超引數調整KerasKeras
- JVM快速調優手冊v1.0之六:JVM引數設定、分析JVM
- JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略JVM面試GC
- Facebook Gaming調查了新冠疫情對工作產生的影響GAM
- JVM效能調優的6大步驟,及關鍵調優引數詳解JVM
- JVM引數以及用法JVM
- MySQL:簡單記錄character_set_server影響引數MySqlServer
- COVID-19全球調查報告:對內部業務的影響
- 貓眼研究院:疫情對觀影意願影響跟蹤調查(一)