這也就意味著用戶不再需要充分了解他們應用程序系統的內存需求。相反地,他們可以相信JVM內存系統可以根據應用程序的需求調整堆大小??s減和擴展通常由堆的使用情況決定。這一特性的發展同時也需要考慮到其他應用程序的內存需求或者JVMs的運行以及應用程序的權限。如果內存的需求突然增加,堆尺寸將動態增長。相反,如果內存需求減少,那么JVM可能會考慮減少Java 堆的尺寸。 另一個可以增加垃圾回收動態特性的方法是自動化nursery管理。在某些情況下,某個nursery可能在一個應用程序的整個運行過程中都沒有用到。因此可以在需要時再將一個nuersery置為使能狀態以此進一步提高性能。用戶不再需要理解垃圾回收機制的內部工作原理就可以獲取最優的應用程序性能。 我們需要設置優先級為垃圾回收系統提供信息,告訴它當前什么是更重要的:短期的中斷(中止時間)還是最大可能的吞吐量。
內存管理系統常常被視為實現系統性能最優的一塊主要絆腳石,因此在過去的幾年里,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)
在一些系統中,應用程序可能會在某些特定的點上處于閑置狀態,對于這樣的系統考慮應用程序的權限是十分有用的。當權限較低的應用程序進入睡眠狀態時,Java 堆可能會暫時收縮,在可能的情況下為權限更高的應用程序提供更多的可用內存。
動態垃圾回收
在運行時,更改垃圾回收機制是另一個已經實現的特性,利用這個特性可以增加BEA WebLogic JRockit內存管理系統的靈活性。某個垃圾回收策略對應用程序運行的某個階段來說是最優的,那么對于另外一個階段可能會有另一個機制是最優的。通過讓JVM決定在每個垃圾回收點上使用哪個垃圾回收機制,可以獲得更好的性能。通過使用這個自動配置垃圾回收器的特性可以實現在運行時動態改變垃圾回收策略,因此理論上不再需要用戶設置啟動選項的標志:
-Xgc: [gencon | singlecon | parallel]
由于這一特性仍處在實驗階段,用戶目前只能通過使用啟動選項標志實現適應性的垃圾回收系統。
-Xgcprio: [throughput | pausetime]
智能壓縮
系統碎片是系統性能的另一個絆腳石。比如,離散在Java堆的小的空閑內存碎片可能引起內存分配失敗,盡管在理論上當前的空閑內存可能可以滿足分配的需要。
通過壓縮可以防止碎片產生,并且這種方法已經使用了相當長的時間。壓縮意味著壓縮已經分配的內存碎片到Java堆的特定區域中,以便可以釋放更大的連續內存空間。
關于Java堆中的哪些區域需要被壓縮的啟發式算法已經重新設計并且得到了改進,但是目前還沒有實現。以前,以某種預定義的順序決定壓縮區域。當然,這的確可以減少碎片,但是使用這種方法即使壓縮失敗也會耗費很多時間,因為一個不包括任何碎片的區域也可能會被選作壓縮對象。新的方法是根據開銷的應用程序配置數據決定需要進行壓縮的區域,這些應用程序配置數據通??梢苑从吵瞿男﹨^域最有壓縮價值。另一個已經設計完成但是尚未實現的改進方法是根據應用程序決定壓縮面積的大小。在那些碎片已經成為問題的應用程序系統中,這些新的特性實現代替了明確設置壓縮區域大小或者壓縮率的需要。
展望未來
現在,內存管理發展的一個主要方向就是實現,改進并且探索自調優特性。全面目標是通過去除啟動選項開銷簡化系統,同時保持高性能。
進一步考慮發展標準,可能會發現其他一些解決時間消耗和費用開銷的問題,比如,動態改善啟發避免最壞情況。下一代JVM將吸取原來的經驗并且分析運行狀況而不斷改善性能。
再深入考慮一下,可以設想JVM可以查找錯誤并且自動分析和創建錯誤報告,發送他們到相關的接收者。最后設想JVM可以針對每個不同的應用系統,自動地實現啟發式優化,而不再需要指定任何一個啟動選項標志。
結束語
正如前面所提到的,今天,客戶從技術上使用先進的JVM的主要目標是盡可能簡單高效的優化性能。
為了實現這個目標,為BEA WebLogic Jrockit設計的自調優內存管理系統可以維護通過強有力的調優獲取的高性能,同時減少了調優的復雜性以及用戶的開銷和工作量。
通過解除用戶的負擔,不再需要他們了解內存管理系統的內部工作原理決定調優決策,在獲得系統簡便的同時,也實現了一個更加靈活的運行系統,在應用程序的整個生命周期,運行系統都會參考應用程序的各種需求和變化。 打破了實現高效調優和保持操作簡便之間的沖突。
原文轉自:http://www.anti-gravitydesign.com