Apusic應用服務器作為企業應用的運行平台
系統的性能非常重要
當應用對性能的要求比較苛刻時
就要考慮是否需要改變系統的缺省設置來提升服務器的性能
首先應該考慮系統的硬件環境(CPU主頻高低
內存大小
硬盤轉速及網絡傳輸速率等)是否能滿足應用的需求
對於復雜的大型分布式企業應用
硬件環境不應該僅僅滿足Apusic應用服務器的最低要求配置
而應該提高硬件配置使應用運行的綽綽有余
如CPU和內存的使用率都不應大於
%
另一方面
改變軟件環境的配置參數對於性能的影響也非常顯著
本文就將介紹如何優化軟件環境配置來提高系統性能
分為兩個方面
Java虛擬機(JVM)的性能優化和Apusic應用服務器配置的優化
Java虛擬機(JVM)的性能優化 Java體系結構由四個不同卻又相互關聯的部分組成
語言本身
class文件格式
JavaAPI庫和JVM
當執行一個Java程序時
源代碼是用Java語言寫成
它被編譯成class文件格式
運行在JVM中
同時
Java程序調用JavaAPI庫的方法
訪問系統資源
JVM和JavaAPI庫形成了編譯和運行環境
就叫做Java平台
JVM是基於堆棧的(stack
based)
而不象匯編語言是基於寄存器的(registerbased)
JVM是一個動態堆棧基礎上的抽象的計算機體系結構
提供了push
pop來操作數據
JVM的主要功能是裝載class文件
執行字節碼
java平台的執行工作量分為四個部分
.字節碼的執行
JVM花費大概一半的時間來解釋字節碼
.Garbagecollection(垃圾回收)
.線程管理
.動態操作
類裝載
綁定檢查
安全檢查
動態類裝載
異常捕獲
反射機制
本地方法的翻譯
其中
對象的垃圾回收會占用運行時間
造成程序的短暫中斷
我們可以通過命令行方式來啟動Apusic服務器
這樣就可以有選擇的設置命令行參數
使用命令行參數的主要目的是
選擇Java程序使用的JVM類型和JVM運行時占用堆內存的分配策略
使用HotSpot HotSpotJVM作為java
SDK的一個附加模塊
使用了state
of
the
art技術大大的提高了系統性能
.適應編譯
HotSpotJVM會在程序的運行過程中分析性能的瓶頸(
hotspots
)
然後編譯這些和性能提高最緊密的部分
.改善的Garbagecollection
.線程同步優化
HotSpotJVM使用兩個機器字(two
machine
word)作為對象的header
而不象大多數JVM使用三個機器字
這樣大約可以節省
%的堆內存空間
加速了對所有對象的掃描
HotSpotJVM也丟棄了handle的概念
對象引用的實現是通過直接指針
減少了內存的使用和提高了處理速度
訪問實例變量象C語言一樣的高效
可以去下載JavaHotSpotTMServerVM
執行安裝即可
如果需要可以針對jdk和jre分別進行安裝
HotSpotJVM分為client和server版本
分別針對典型的客戶端應用程序和服務器端應用進行了優化
Jdk
安裝後就包含了JavaHotSpotClientVM
上面安裝的是JavaHotSpotServerVM
可以通過命令行參數選擇要使用的JVM
;java
server
JavaHotSpotServerVM
;java
hotspot:JavaHotSpotClientVM
;java
classic
Java
ClassicVM
缺省情況是使用HotSpotClientVM
可以用java
server
version來查看版本信息
確定是否以正確安裝
只要針對不同的應用
選擇Client或ServerHotSpotVM
對於Server
side應用
有時性能會提高
%
只要簡單的在命令行啟動Server時加上
server
GarbageCollection HotSpotJVM提供了三種類型的垃圾回收算法
分別是
.Copy/scavengecollection
.Mark
compactcollection
.Incremental(train)collection
具體的含義我不解釋了
有興趣可以查看相關的文檔
一個JVM的吞吐量是指除去GC消耗的時間占總執行時間的百分比
因此
%的吞度量就是說GC消耗了
%的JVM處理時間
當你的應用程序運行時
JVM的GC會造成程序的暫停
堆內存被分成了new和old兩部分
如下圖
new部分包括新創建對象區和兩個survivor區(SS#
和SS#
)
新創建的對象分配內存在new中
長時間存活的對象被移動到了old部分
Perm是一個永久區域
分配給JVM本省
可以通過命令行參數
XX:MaxPermSize=
m來設置
當new被填滿後
會觸發
輔助
GC
把存在足夠長時間的對象移動到old中
當old中也被填滿了
會觸發
主
GC
將遍歷堆內存中的所有對象
可以看出
主
GC會消耗更多的時間
足夠大的new會適合需要大量創建存在時間很短的對象
而old如果不夠大會頻繁的觸發
主
GC
大大降低了性能
所以
我們的任務就是如何設置堆內存的大小以及如何規劃new和old區域的比例來適合我們應用
輔助
GC使用Copy/scavengecollection算法
主
GC使用Mark
compactcollection
Heap分配策略 通過命令行參數
我們可以設置堆的大小和分配
new
old
的比例
一些常用參數如下
詳細的參數設置請參看相關的文檔
如何來規劃我們的堆內存分配策略呢?沒有一個明確詳細的規定
只能根據我們具體的應用進行調節
使性能達到最優化
這種優化方法不需要程序員改變代碼
但有時效果會很明顯
下面總結了一些操作建議
;如果GC成為了瓶頸
請定制你的堆內存分配
;分配盡可能多的內存給JVM
但如果過多
會引起內存和硬盤之間的交換
反而降低的性能
你可以分配
%的可用RAM給JVM
;如果是Server
Side應用
請加
server參數
這樣
缺省的NewRatio是
SurvivorRatio是
適合大部分應用
也可以用NewSize
MaxNewSize來設置
;設置
Xms和
Xmx的大小相等
可以避免在每次GC後調整堆內存的大小
;同樣道理設置NewSize
MaxNewSize相等
;
new
的大小最好不要大於
old
的一半
例如
可以通過下面的命令行啟動Apusic服務器
java
server
XX:NewSize=
m
XX:MaxNewSize=
m
XX:SurvivorRatio=
Xms
m
Xmx
mcom
apusic
server
Main
Apusic應用服務器配置的優化
下面主要說明Apusic中的兩個文件影響性能的參數說明(這兩個文件放在%APUSIC_HOME%\config目錄中)及數據庫中的設置
nf
把其中兩個參數修改為
MaxClients參數值設置的目的是防止拒絕服務攻擊
當參數值設置較小時可以限制服務流量
起到防止拒絕服務攻擊的作用
但是當訪問的用戶較多時而此參數設置較小時卻會影響性能
一般情況下
不考慮防止拒絕服務攻擊
此參數設置為
表示服務流量沒有限制
MaxWaitingClients
與MaxClients有類似的功能
他表示當許多並發用戶訪問時
可允許等待的最大客戶服務數
一般情況下
不考慮防止拒絕服務攻擊
此參數設置為較大的數
如
如果設置較小
如
當等待響應的並發服務隊列數超過
時
使得一些服務得不到響應
從而丟失一些響應結果
datasourcesxml min
spare
connections
指連接池最小容量
max
spare
connections
指連接池最大容量
stmt
cache
size
指語句緩存容量
resultset
cache
size
指結果集緩存容量
resultset
cache
timeout
指結果集緩存超時配置如下
……
連接池最小容量
也就是初始連接數
此值不宜設置太小
太小須不斷建立連接
也不宜設置太大
太大消耗資源
連接池最大容量
連接池中可容納的最大連接數
當連接池中的連接數不夠用時
需要等待其他的被使用的連接得到釋放
才能使用
否則只能等待
根據應用的實際情況設置此值
語句緩存容量
對所執行的語句進行緩存
當再次執行此語句時
不必重新編譯
從而提高了性能
根據機器內存的大小適當設置此值
結果集緩存容量
把所得到的結果集進行緩存
當再次使用此結果集時
不必再次從數據庫中取得
而可以直接從緩存中取得
從而提高性能
根據機器內存的大小適當設置此值
結果集緩存超時
結果集過期時間
此時間不宜設置過長
以免浪費資源
注
語句緩存容量
結果集緩存容量
結果集緩存超時參數主要針對Oracle數據庫來設計的
通過適當的調節Java虛擬機和Apusic的配置文件
可以顯著的提升系統的性能
在一些具體的應用中
還能夠通過增加實例池
加大Cached
改變並發策略等方法來改善系統的整體性能
開發人員只要經過不斷的總結
就可以在Apusic應用服務器上開發出穩定而又高性能的企業應用
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26290.html