內存管理系統常常被視為實現系統性能最優的一塊主要絆腳石
因此在過去的幾年裡
Java應用環境對高效執行內存調優的需求急劇增長
受此影響JVM供應商開始一哄而上提供配置內存的特殊選項
獲取最優內存性能——沒有中斷
最大限度地提高吞吐量——已經變得越來越復雜
除了迫切需要高效的調優功能之外
客戶也十分明確地提出了簡化操作的需求
解決問題的方法是以最小的開銷提供自調優和具備自適應性的運行時環境
目前
一些新技術在實現系統性能最優的同時
減少了調優的用戶操作復雜性
其中包括由應用程序決定Java堆的大小
動態適應的垃圾回收和智能壓縮
這篇文章討論了內存調優的復雜性
自調優內存系統的優勢
其中一些面向BEA WebLogic Jrockit研發的新特性
將來可能會在BEA WebLogic Jrockit運用
內存調優 - 一個復雜的問題 由於Java應用程序具有平台獨立性以及多樣性的特點
我們不可能創建出一個性能最優的通用內存配置
因此
使JVM針對不同環境實現內存調優的能力已經變得越來越重要
一般來說
調優的目的就是通過調整JVM的某些特性以適應各個不同的應用系統
最終達到優化性能的目的
通常調整JVM到最優狀態需要耗費大量的時間
因此
JVM提供商已經為客戶提供了一些減少調優工作量的方法
常用的解決方法是為每個客戶提供所需的啟動選項
為了滿足每個客戶的需要
啟動項目的數目已經增加到一個不可預見的數量
這樣做的一個不利影響就是
客戶必須首先具備一些JVM的知識
才可以掌握如何使用和組合這些選項
換句話說
如果一個客戶並不熟JVM的內部工作
那麼對他來說這個解決方法將要耗費大量的時間
另一個解決方法就是通過專門的咨詢專家在站點提供調優服務
咨詢專家對於JVM的內部工作原理已經了解
他們所要做的就是
了解客戶系統以便設置調優選項保證性能最優
然而
咨詢專家了解客戶系統的需求可能也需要大量的時間
並且可能在與客戶溝通的過程中
由於涉及到一些客戶不願透漏的敏感和重要信息而發生沖突
因此這個解決方案的開銷同樣很大
由於相對前幾年來
對性能高效和縮減開銷的需求越來越備受關注
沒有可調優功能的JVM無法良好運作
因此這樣的JVM已經不再被接受
然而現存的解決方案過於昂貴
時間開銷過大而且復雜性過高
我們需要一個新的廉價
快捷
簡便的解決方案
目的仍然是在使系統在對於JVM運行的所有平台上任何一個可能的應用程序始終保持性能最優
對於新的發展趨勢
您不再需要了解您的系統
相反
您所要做得就是信任JVM可以找到最優的配置
實現思想主要是創建一個JVM
它可以通過利用開銷較低的應用程序配置數據進行自調優
自動地適應每一個客戶應用程序
自調優內存系統的優勢 相對於手動調優來說
自調優內存系統不但減少了調優的時間
而且也減少了調優所需要的開銷
除了獲取與手動配置系統相當的性能之外
自調優的機制還可以處理一個應用程序環境所需要的各種改變
由於調優策略基於開銷較低的應用程序配置數據
因此一旦這些數據發生變化
比如
當一個應用程序需要變化
調優就會發生
因此
自調優內存系統動態改變參數
在任何時候都可以獲得更好的性能
而不再為滿足某個應用程序系統的系統內存需求而在某個點(啟動之前)對 JVM進行調優
自調優內存系統的優勢在於JVM在獲得
或者說改善整體性能的同時也保持了簡單的特性
而唯一的限制就是系統所引入的每個動態參數的實現已經變得越來越復雜
因此
如何進行內存調優以此優化系統性能
這個問題的責任已經回到了它本來該屬於的地方
內存系統開發者的辦公桌上
而不再成為需要客戶所承擔的花費
時間或者知識的負擔
自適應的內存管理 在JVM提供商中一個新的趨勢就是研究自調優的特性
BEA WebLogic Jrockit已經在探索和開發不同的自適應特性方面做了很多工作
不久將會推出一個新的自調優內存管理系統
在這個系統中采用了其中的一些新特性
由應用環境決定Java堆的調整 BEA WebLogic Jrockit實現的特性之一就是在運行時擴展和縮減Java堆
這一動態特性消除了通過明確設置啟動選項標志實現優化性能的需要
Xms [size] [g|G|m|M|k|K] (initial heap size)
Xmx [size] [g|G|m|M|k|K] (maximum heap size)
這也就意味著用戶不再需要充分了解他們應用程序系統的內存需求相反地他們可以相信JVM內存系統可以根據應用程序的需求調整堆大小縮減和擴展通常由堆的使用情況決定這一特性的發展同時也需要考慮到其他應用程序的內存需求或者JVMs的運行以及應用程序的權限如果內存的需求突然增加堆尺寸將動態增長相反如果內存需求減少那麼JVM可能會考慮減少Java 堆的尺寸
在一些系統中應用程序可能會在某些特定的點上處於閒置狀態對於這樣的系統考慮應用程序的權限是十分有用的當權限較低的應用程序進入睡眠狀態時Java 堆可能會暫時收縮在可能的情況下為權限更高的應用程序提供更多的可用內存
動態垃圾回收
在運行時更改垃圾回收機制是另一個已經實現的特性利用這個特性可以增加BEA WebLogic JRockit內存管理系統的靈活性某個垃圾回收策略對應用程序運行的某個階段來說是最優的那麼對於另外一個階段可能會有另一個機制是最優的通過讓JVM決定在每個垃圾回收點上使用哪個垃圾回收機制可以獲得更好的性能通過使用這個自動配置垃圾回收器的特性可以實現在運行時動態改變垃圾回收策略因此理論上不再需要用戶設置啟動選項的標志
Xgc: [gencon | singlecon | parallel]
另一個可以增加垃圾回收動態特性的方法是自動化nursery管理在某些情況下某個nursery可能在一個應用程序的整個運行過程中都沒有用到因此可以在需要時再將一個nuersery置為使能狀態以此進一步提高性能用戶不再需要理解垃圾回收機制的內部工作原理就可以獲取最優的應用程序性能
由於這一特性仍處在實驗階段用戶目前只能通過使用啟動選項標志實現適應性的垃圾回收系統
Xgcprio: [throughput | pausetime]
我們需要設置優先級為垃圾回收系統提供信息告訴它當前什麼是更重要的短期的中斷(中止時間)還是最大可能的吞吐量
智能壓縮
系統碎片是系統性能的另一個絆腳石比如離散在Java堆的小的空閒內存碎片可能引起內存分配失敗盡管在理論上當前的空閒內存可能可以滿足分配的需要
通過壓縮可以防止碎片產生並且這種方法已經使用了相當長的時間壓縮意味著壓縮已經分配的內存碎片到Java堆的特定區域中以便可以釋放更大的連續內存空間
關於Java堆中的哪些區域需要被壓縮的啟發式算法已經重新設計並且得到了改進但是目前還沒有實現以前以某種預定義的順序決定壓縮區域當然這的確可以減少碎片但是使用這種方法即使壓縮失敗也會耗費很多時間因為一個不包括任何碎片的區域也可能會被選作壓縮對象新的方法是根據開銷的應用程序配置數據決定需要進行壓縮的區域這些應用程序配置數據通常可以反映出哪些區域最有壓縮價值另一個已經設計完成但是尚未實現的改進方法是根據應用程序決定壓縮面積的大小在那些碎片已經成為問題的應用程序系統中這些新的特性實現代替了明確設置壓縮區域大小或者壓縮率的需要
展望未來
現在內存管理發展的一個主要方向就是實現改進並且探索自調優特性全面目標是通過去除啟動選項開銷簡化系統同時保持高性能
進一步考慮發展標准可能會發現其他一些解決時間消耗和費用開銷的問題比如動態改善啟發避免最壞情況下一代JVM將吸取原來的經驗並且分析運行狀況而不斷改善性能
再深入考慮一下可以設想JVM可以查找錯誤並且自動分析和創建錯誤報告發送他們到相關的接收者最後設想JVM可以針對每個不同的應用系統自動地實現啟發式優化而不再需要指定任何一個啟動選項標志
結束語
正如前面所提到的今天客戶從技術上使用先進的JVM的主要目標是盡可能簡單高效的優化性能
為了實現這個目標為BEA WebLogic Jrockit設計的自調優內存管理系統可以維護通過強有力的調優獲取的高性能同時減少了調優的復雜性以及用戶的開銷和工作量
通過解除用戶的負擔不再需要他們了解內存管理系統的內部工作原理決定調優決策在獲得系統簡便的同時也實現了一個更加靈活的運行系統在應用程序的整個生命周期運行系統都會參考應用程序的各種需求和變化 打破了實現高效調優和保持操作簡便之間的沖突
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27321.html