# (三) :提高Web應用服務器Tomcat的內存配置,并確認配置正確
**摘要**
上一篇,[一個Web報表項目的性能分析和優化實踐(一):小試牛刀,統一顯示SQL語句執行時間?](http://blog.csdn.net/fansunion/article/details/13620783),講述了項目優化的整體背景,重點講述了統一顯示了Web項目SQL語句的執行時間。
本篇,將重點介紹提高Web應用服務器Tomcat的內存配置,并確認配置正確的方法。
**背景**
這個Web報表項目,用的Linux系統,Web應用服務器使用的是Tomcat7.0。
根據已有程序開發的經驗,我認為手動分配和提高Tomcat的內存,能夠降低Web請求響應時間,提高系統的性能。
手動提高Tomcat內存前后的響應時間,沒有記錄和進行對比,因此“提高了系統的性能”現在只能算是一種“感覺”。
實際提升了多大幅度的性能,還需要有真實數據進行對比才能知道。
本文,不再探討此問題,重點闡述如何配置Linux下的Tomcat的內存。
**1.配置方法**
**Linux系統**
在/usr/local/tomcat/bin 目錄下的catalina.sh添加:
JAVA_OPTS='-Xms512m -Xmx1024m'
要加“m”說明是MB,否則就是KB了,在啟動tomcat時會 報內存不足。
-Xms:初始值
-Xmx:最大值
-Xmn:最小值
注:Tomcat的路徑可能有所不同。
**catalina.sh**
~~~
# -----------------------------------------------------------------------------(上面還有很多#開頭的注釋)
# OS specific support.? $var _must_ be set to either true or false.
**JAVA_OPTS= ‘-Xms512m -Xmx1024m’**
cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
esac
~~~
**Windows系統**
在catalina.bat最前面加入
set JAVA_OPTS=-Xms128m -Xmx350m
**經驗教訓**
Linux下的配置方法和Windows下的是不一樣的。
這類問題是很常見的,總結成文,而不是放在大腦里,很有必要。
**2.查看Tomcat的內存配置**
如果,我們只是根據自己的或者網友的方法,配置了參數,就認為“萬事大吉”,是非常不科學的,是不負責任的表現。
Tomcat完整的壓縮包中,webapps目錄含有manager這個項目。
比如C:\apache-tomcat-7.0.22\webapps\manager
我們Linux系統的項目中,已經把這個模塊刪除了。
現在,重新拷貝這個模塊到Tomcat的webapps目錄。
**第一次訪問的時候,沒有權限。**
需要修改tomcat的conf目錄下的tomcat-users.xml這個配置文件,增加以下配置
~~~
<tomcat-users>
<role rolename="manager-gui"/>
<user username="username" password="123456" roles="manager-gui"/>
</tomcat-uses>
~~~
然后,使用配置的用戶名和密碼,訪問?[http://ip:port/manager](http://ip:port/manager)。
點擊Server Status 超鏈接,或者直接訪問?[http://ip:port/manager/status](http://ip:port/manager/status)。
可以看到以下信息
[](http://fansunion.cn/wp-content/uploads/2013/10/TomcatServerStatus.gif)
看到“Free memory: 268.18 MB Total memory: 970.18 MB Max memory: 1758.25 MB”才真正表明,我們的配置成功了。
**3.真相何在**
細心的讀者可能會發現,“Free memory: 268.18 MB Total memory: 970.18 MB Max memory: 1758.25 MB”與我們配置的?‘-Xms512m -Xmx1024m’不完全吻合。
從上面的參數中,我們只能知道Tomcat的內存確實增大了,但是增大的規則和我們預期的不完全一樣。
Total memory和Max memory等具體表示啥含義,為什么會是這樣,我現在還不是很清楚。
這個問題暫時不再深究,今后,再看Tomcat的書籍和文檔,可能能夠找到這個問題的答案。
知道的同學,可以留言告訴我下。
**4.回答一個熱心網友的評論**
**評論內容**
我沒有仔細看你寫的代碼,但是看你的標題之后,我處理的流程會是:
在程序沒有錯的情況下,
一、看hql語句是否被濫用了,該用select col from table的寫成select * from table了
二、看where子句的執行順序,一般最后面的條件是過濾掉大部分數據的條件,以次類推。看看是否改用join的地方使用了select col from table where col in (select ...)的語句,檢查視圖的sql語句
三、給表的列適當建立索引
四、再高級一些的就是讀寫分離或者mysql集群了(我也木有搞過)
--評論參見:[http://blog.csdn.net/fansunion/article/details/13620783](http://blog.csdn.net/fansunion/article/details/13620783)
**我的回復**
1."該用select col from table的寫成select * from table了"
查詢了過多的字段,這種情況是存在的。
這個晚點優化。
2.看where子句的執行順序。
咱們用的大多數 關聯查詢,很少用子查詢。
這個晚點優化。
3.給表的列適當建立索引。
這個是本周的重點。
我們有一個數據庫,全是數據和維度,有數據更新的時候,才會插入。
索引會比較有效。
4.讀寫分離或者mysql集群。
等正式上線,數據量大了之后,應該會弄。
我也不熟悉,需要邊學邊用,不會的就去問boss或者公司相關大牛。