盡管 JVM 調整操作隨 JVM 提供程序的不同而有所變化,但一般的調整概念適用于所有 JVM。這些一般的概念包括:
編譯器調整。在服務器運行時期間,所有 JVM 都使用即時(JIT)編譯器來將 Java 字節碼編譯為本機指令。
Java 內存或堆調整。JVM 內存管理功能(即垃圾回收)為提高 JVM 性能提供了其中一種最大的可能性。
類裝入調整。
過程
優化啟動性能和運行時性能
在某些環境中,優化 WebSphere Application Server
的啟動性能比優化運行時性能更重要。在另一些環境中,優化運行時性能更為重要。缺省情況下,IBM JVM 是針對運行時性能進行優化的,而基于
HotSpot 的 JVM 是針對啟動性能進行優化的。
Java JIT
編譯器在很大程度上決定了是優化啟動性能還是優化運行時性能。編譯器使用的初始優化級別影響編譯類方法所耗用的時間以及啟動服務器所耗用的時間。為了提高
啟動速度,可以降低編譯器所使用的初始優化級別。這意味著,由于現在使用較低的優化級別來編譯類方法,所以應用程序的運行時性能可能會下降。
因為編譯器在運行時執行階段會根據自己的判斷來重新編譯類方法以提高性能,所以,很難提供一個有關特定的運行時性能影響的說明。最終,應用程序的持續時間
是影響運行時性能下降程度的主要原因。運行時間較短的應用程序的方法被重新編譯的可能性較高。運行時間較長的應用程序的方法被重新編譯的可能性較低。
IBM JVM 的缺省設置是使用高優化級別來執行初始編譯。如果需要更改此行為,可以使用以下 IBM JVM 選項:
-Xquickstart
此設置影響 IBM JVM 使用較低優化級別來編譯類方法的方式,這將提高服務器啟動速度,但會使運行時性能下降。缺省情況下,如果未指定此參數,IBM JVM 最初將使用較高的初始優化級別來執行編譯。此設置能夠提高運行時性能,但會減慢服務器啟動速度。
缺省值: 高初始編譯器優化級別
建議值: 高初始編譯器優化級別
用法: -Xquickstart 可以加快服務器啟動速度。
基于 Sun 的 Hotspot 技術的 JVM 最初使用低優化級別來編譯類方法。使用下列 JVM 選項來更改此行為:
-server
基于 Sun 的 Hotspot 技術的 JVM 最初使用低優化級別來編譯類方法。這些 JVM 使用簡單編譯器和能夠進行優化的 JIT
編譯器。通常情況下,使用簡單 JIT
編譯器。然而,可以通過設置此選項來使用能夠執行優化的編譯器。此更改將顯著提高服務器的性能,但使用能夠執行優化的編譯器時,服務器的預備時間將會較
長。
缺省值: 簡單編譯器
建議值: 能夠執行優化的編譯器
用法: -server 啟用能夠執行優化的編譯器。
設置堆大小 下列命令行參數對于設置堆大小來說很有用。
-Xms
此設置控制 Java 堆的初始大小。正確調整此參數有助于降低垃圾回收開銷,從而縮短服務器響應時間并提高吞吐量。對于某些應用程序來說,此選項的缺省設置可能會太低,從而導致發生大量小型垃圾回收。
缺省值: 256 MB
建議值: 隨工作負載的不同而有所變化,但高于缺省值。
用法: -Xms256m 將初始堆大小設置為 256 兆字節
-Xmx
此設置控制 Java 堆的最大大小。正確調整此參數有助于降低垃圾回收開銷,從而縮短服務器響應時間并提高吞吐量。對于某些應用程序來說,此選項的缺省設置可能會太低,從而導致發生大量小型垃圾回收。
缺省值: 512 MB
建議值: 隨工作負載的不同而有所變化,但高于缺省值。
用法: -Xmx512m 將最大堆大小設置為 512 兆字節
-Xlp
此設置可以與 IBM JVM 配合使用,以使用大頁來分配堆。然而,如果使用此設置,那么必須將操作系統配置為支持大頁。使用大頁可以降低 CPU 跟蹤堆內存時的開銷,并且還允許創建較大的堆。
請參閱調整操作系統 以了解有關調整操作系統的更多信息。
應該指定的堆大小取決于不同時段的堆使用情況。在堆大小頻繁更改的情況下,對 Xms 和 Xmx 參數指定相同的值可以提高性能。
調整 IBM JVM 的垃圾回收器。
使用 Java -X 選項來查看內存選項列表。
-Xgcpolicy
將 gcpolicy 設置為 optthruput
會禁用并發標記。如果沒有暫停時間問題(表現為應用程序響應時間不規律),那么應該使用此選項來實現最大吞吐量。將 gcpolicy 設置為
optavgpause
會使用缺省值來啟用并發標記。此設置將減少由正常垃圾回收所引起的應用程序響應時間不規律情況。然而,此選項可能會降低整體吞吐量。
缺省值: optthruput
建議值: optthruput
用法: Xgcpolicy:optthruput
-Xnoclassgc
缺省情況下,當一個類沒有任何活動實例時,JVM 就會從內存中卸裝該類,但是這樣會使性能下降。如果關閉類垃圾回收,就可以消除由于多次裝入和卸裝同一個類而造成的開銷。
如果不再需要某個類,那么該類在堆中所占用的空間通常將用于創建新對象。但是,如果應用程序通過創建類的新實例來處理請求,并且該應用程序的請求是隨機出
現的,那么可能會發生以下情況:先前請求者完成后,正常的類垃圾回收將通過釋放這個類占用的堆空間來清除這個類,但當下一個請求出現時,又必須將這個類重
新實例化。在這種情況下,您可能想使用此選項來禁用類垃圾回收。
缺省值: 啟用類垃圾回收
建議值: 禁用類垃圾回收
用法: Xnoclassgc 禁用類垃圾回收
有關其他信息,請參閱下列 DeveloperWorks 文章:
http://www.ibm.com/developerworks/java/
調整 Sun JVM 的垃圾回收器
在 Solaris 平臺上,WebSphere Application Server 在 Sun Hotspot JVM 上運行,而不是在 IBM JVM 上運行。對 Sun JVM 使用正確的調整參數以利用其性能優化功能十分重要。
Sun Hotspot JVM 依靠分代垃圾回收來實現最佳性能。下列命令行參數對于調整垃圾回收來說非常有用。
-XX:SurvivorRatio
將 Java
堆劃分為舊對象(長生命周期對象)區域和新對象區域。新對象區域進一步細分為兩部分,第一部分用于分配給新對象(初始區域),第二部分存放那些經過其前幾
次垃圾回收之后、但在被提升為舊對象之前仍在使用中的新對象(幸存者空間)。幸存者比率是堆的新對象區域中初始區域與幸存者空間的比率。增大此設置將針對
需要創建大量對象但僅保留少量對象的應用程序優化 JVM。與其他應用程序相比,WebSphere Application Server
會生成更多中等生命周期對象和長生命周期對象,因此,應該將此設置設置為小于缺省值。
缺省值: 32
建議值: 16
用法: -XX:SurvivorRatio=16
-XX:PermSize
為永久生成對象保留的堆區域存儲 JVM 的所有反射數據。對于動態地裝入和卸裝大量類的應用程序來說,應該增大此大小以優化它們的性能。通過將此參數設置為 128MB,可以消除增大此部分堆所需的開銷。
建議值: 128 MB
用法: XX:PermSize=128m 將 perm 大小設置為 128 兆字節。
-Xmn
此設置控制允許新生成的對象在堆中耗用的空間量。正確調整此參數有助于降低垃圾回收開銷,從而縮短服務器響應時間并提高吞吐量。此參數的缺省設置通常過
低,這將導致執行大量的小型垃圾回收操作。如果將此參數設置得過高,可能會導致 JVM
僅執行大型(全面)垃圾回收。這些垃圾回收操作通常會耗時幾秒鐘,這將嚴重影響服務器的整體性能。您必須保持將此參數設置為小于整個堆大小的一半,以避免
這種情況出現。
缺省值: 2228224 字節
建議值: 大約整個堆大小的 1/4
用法: -Xmn256m 將大小設置為 256 兆字節。
-Xnoclassgc
缺省情況下,當一個類沒有任何活動實例時,JVM 就會從內存中卸裝該類,但是這樣會使性能下降。如果關閉類垃圾回收,就可以消除由于多次裝入和卸裝同一個類而造成的開銷。
如果不再需要某個類,那么該類在堆中所占用的空間通常將用于創建新對象。但是,如果應用程序通過創建類的新實例來處理請求,并且該應用程序的請求是隨機出
現的,那么可能會發生以下情況:先前請求者完成后,正常的類垃圾回收將通過釋放這個類占用的堆空間來清除這個類,但當下一個請求出現時,又必須將這個類重
新實例化。在這種情況下,您可能想使用此選項來禁用類垃圾回收。
缺省值: 啟用類垃圾回收
建議值: 禁用類垃圾回收
用法: Xnoclassgc 禁用類垃圾回收
有關調整 Sun JVM 的其他信息,請參閱 Java HotSpot VM 的性能文檔。
調整 HP JVM 的垃圾回收器
HP JVM 依靠分代垃圾回收來實現最佳性能。下列命令行參數對于調整垃圾回收來說非常有用。
-Xoptgc
此設置針對包含許多短生命周期對象的應用程序優化 JVM。如果未指定此參數,那么 JVM 通常執行大型(全面)垃圾回收。全面垃圾回收會花費幾秒鐘時間,這將顯著影響服務器性能。
缺省值: off
建議值: on
用法: -Xoptgc 啟用優化的垃圾回收。
-XX:SurvivorRatio
將 Java
堆劃分為舊對象(長生命周期對象)區域和新對象區域。新對象區域進一步細分為兩部分,第一部分用于分配給新對象(初始區域),第二部分存放那些經過其前幾
次垃圾回收之后、但在被提升為舊對象之前仍在使用中的新對象(幸存者空間)。幸存者比率是堆的新對象區域中初始區域與幸存者空間的比率。增大此設置將針對
需要創建大量對象但僅保留少量對象的應用程序優化 JVM。與其他應用程序相比,WebSphere Application Server
會生成更多中等生命周期對象和長生命周期對象,因此,應該將此設置設置為小于缺省值。
缺省值: 32
建議值: 16
用法: -XX:SurvivorRatio=16
-XX:PermSize
為永久生成對象保留的堆區域存儲 JVM 的所有反射數據。對于動態地裝入和卸裝大量類的應用程序來說,應該增大此大小以優化它們的性能。通過將此參數指定為 128 兆字節,可以消除增大此部分堆所需的開銷。
缺省值: 0
建議值: 128 兆字節
用法: -XX:PermSize=128m 將 PermSize 設置為 128 兆字節
-XX:+ForceMmapReserved
缺省情況下,Java 堆以“惰性交換”方式進行分配。在此方式下,將根據需要來分配內存頁,這樣可以節省交換空間,但是也將強制使用 4KB
頁。在大型堆系統中,這種內存分配方式允許堆包含數以十萬計的頁。此命令禁用“惰性交換”并允許操作系統使用較大的內存頁,從而優化對構成 Java
堆的內存的訪問。
缺省值: off
建議值: on
用法: -XX:+ForceMmapReserved 將禁用“惰性交換”。
-Xmn
此設置控制允許新生成的對象在堆中耗用的空間量。正確調整此參數有助于降低垃圾回收開銷,從而縮短服務器響應時間并提高吞吐量。此參數的缺省設置通常過低,這將導致執行大量的小型垃圾回收操作。
缺省值: 沒有缺省值
建議值: 大約整個堆大小的 3/4
用法: -Xmn768m 將大小設置為 768 兆字節
虛擬頁大小
通過將 Java 虛擬機的指令頁大小和數據頁大小設置為 64MB,可以提高性能。
缺省值: 4MB
建議值: 64MB
用法: 使用以下命令。命令輸出提供了進程可執行文件的當前操作系統特征:
chatr +pi64M +pd64M /opt/WebSphere/
AppServer/java/bin/PA_RISC2.0/
native_threads/java
-Xnoclassgc
缺省情況下,當一個類沒有任何活動實例時,JVM 就會從內存中卸裝該類,但是這樣會使性能下降。如果關閉類垃圾回收,就可以消除由于多次裝入和卸裝同一個類而造成的開銷。
如果不再需要某個類,那么該類在堆中所占用的空間通常將用于創建新對象。但是,如果應用程序通過創建類的新實例來處理請求,并且該應用程序的請求是隨機出
現的,那么可能會發生以下情況:先前請求者完成后,正常的類垃圾回收將通過釋放這個類占用的堆空間來清除這個類,但當下一個請求出現時,又必須將這個類重
新實例化。在這種情況下,您可能想使用此選項來禁用類垃圾回收。
缺省值: 啟用類垃圾回收
建議值: 禁用類垃圾回收
用法: Xnoclassgc 禁用類垃圾回收
有關調整 HP 虛擬機的其他信息,請參閱 Java 技術軟件 HP-UX 11i。
調整 HP 的 JVM for HP-UX 設置下列選項以提高應用程序性能:
-XX:SchedulerPriorityRange=SCHED_NOAGE
-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.DevPollSelectorProvider
-XX:-ExtraPollBeforeRead