內存方式的設置是在 catalina.sh 中,調整一下 JAVA_OPTS 變量便可,由於後java
面的啓動參數會把 JAVA_OPTS 做爲 JVM 的啓動參數來處理。nginx
具體設置以下:web
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -面試
XX:NewRatio=4 -XX:SurvivorRatio=4"apache
其各項參數以下:windows
-Xmx3550m:設置 JVM 最大可用內存爲 3550M。tomcat
-Xms3550m:設置 JVM 促使內存爲 3550m。此值能夠設置與-Xmx 相同,以session
避免每次垃圾回收完成後 JVM 從新分配內存。併發
-Xmn2g:設置年輕代大小爲 2G。整個堆大小=年輕代大小 + 年老代大小 +app
持久代大小。持久代通常固定大小爲 64m,因此增大年輕代後,將會減少年老
代大小。此值對系統性能影響較大,Sun 官方推薦配置爲整個堆的 3/8。
-Xss128k:設置每一個線程的堆棧大小。JDK5.0 之後每一個線程堆棧大小爲 1M,
之前每一個線程堆棧大小爲 256K。更具應用的線程所需內存大小進行調整。在相
同物理內存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的
線程數仍是有限制的,不能無限生成,經驗值在 3000~5000 左右。
-XX:NewRatio=4:設置年輕代(包括 Eden 和兩個 Survivor 區)與年老代的比
值(除去持久代)。設置爲 4,則年輕代與年老代所佔比值爲 1:4,年輕代佔
整個堆棧的 1/5
-XX:SurvivorRatio=4:設置年輕代中 Eden 區與 Survivor 區的大小比值。設置
爲 4,則兩個 Survivor 區與一個 Eden 區的比值爲 2:4,一個 Survivor 區佔整
個年輕代的 1/6
-XX:MaxPermSize=16m:設置持久代大小爲 16m。
-XX:MaxTenuringThreshold=0:設置垃圾最大年齡。若是設置爲 0 的話,則年
輕代對象不通過 Survivor 區,直接進入年老代。對於年老代比較多的應用,可
以提升效率。若是將此值設置爲一個較大值,則年輕代對象會在 Survivor 區進
行屢次複製,這樣能夠增長對象再年輕代的存活時間,增長在年輕代即被回收
的概論。
垃圾回收的設置也是在 catalina.sh 中,調整 JAVA_OPTS 變量。
具體設置以下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -
XX:+UseParallelGC -XX:MaxGCPauseMillis=100"
具體的垃圾回收策略及相應策略的各項參數以下:
串行收集器(JDK1.5 之前主要的回收方式)
-XX:+UseSerialGC:設置串行收集器
並行收集器(吞吐量優先)
示例:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -
XX:MaxGCPauseMillis=100
-XX:+UseParallelGC:選擇垃圾收集器爲並行收集器。此配置僅對年輕代有
效。即上述配置下,年輕代使用併發收集,而年老代仍舊使用串行收集。
-XX:ParallelGCThreads=20:配置並行收集器的線程數,即:同時多少個線程
一塊兒進行垃圾回收。此值最好配置與處理器數目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式爲並行收集。JDK6.0 支持
對年老代並行收集
-XX:MaxGCPauseMillis=100:設置每次年輕代垃圾回收的最長時間,若是沒法
知足此時間,JVM 會自動調全年輕代大小,以知足此值。
-XX:+UseAdaptiveSizePolicy:設置此選項後,並行收集器會自動選擇年輕代
區大小和相應的 Survivor 區比例,以達到目標系統規定的最低相應時間或者收
集頻率等,此值建議使用並行收集器時,一直打開。
併發收集器(響應時間優先)
示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -
XX:+UseConcMarkSweepGC
-XX:+UseConcMarkSweepGC:設置年老代爲併發收集。測試中配置這個以
後,-XX:NewRatio=4 的配置失效了,緣由不明。因此,此時年輕代大小最好
用-Xmn 設置。
-XX:+UseParNewGC: 設置年輕代爲並行收集。可與 CMS 收集同時使用。
JDK5.0 以上,JVM 會根據系統配置自行設置,因此無需再設置此值。
-XX:CMSFullGCsBeforeCompaction:因爲併發收集器不對內存空間進行壓
縮、整理,因此運行一段時間之後會產生「碎片」,使得運行效率下降。此值
設置運行多少次 GC 之後對內存空間進行壓縮、整理。
-XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮。可能會影響性
能,可是能夠消除碎片
目前的處理方式有以下幾種:
1).使用 Tomcat 自己的 Session 複製功能
參考 http://ajita.iteye.com/blog/1715312(Session 複製的配置)
方案的有點是配置簡單,缺點是當集羣數量較多時,Session 複製的時間會比
較長,影響響應的效率
2).使用第三方來存放共享 Session
目前用的較多的是使用 memcached 來管理共享 Session,藉助於
memcached-sesson-manager 來進行 Tomcat 的 Session 管理
參考 http://ajita.iteye.com/blog/1716320(使用 MSM 管理 Tomcat 集羣
session)
3).使用黏性 session 的策略
對於會話要求不太強(不涉及到計費,失敗了容許從新請求下等)的場合,同
一個用戶的 session 能夠由 nginx 或者 apache 交給同一個 Tomcat 來處理,這
就是所謂的 session sticky 策略,目前應用也比較多
參考:http://ajita.iteye.com/blog/1848665(tomcat session sticky)
nginx 默認不包含 session sticky 模塊,須要從新編譯才行(windows 下我也不
知道怎麼從新編譯)
優勢是處理效率高多了,缺點是強會話要求的場合不合適
對於部署在局域網內其它機器上的 Tomcat,能夠打開 JMX 監控端口,局域網
其它機器就能夠經過這個端口查看一些經常使用的參數(但一些比較複雜的功能不
支持),一樣是在 JVM 啓動參數中配置便可,配置以下:
-Dcom.sun.management.jmxremote.ssl=false -
Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.71.38 設置 JVM 的 JMS 監控監聽的 IP
地址,主要是爲了防止錯誤的監聽成 127.0.0.1 這個內網地址
-Dcom.sun.management.jmxremote.port=1090 設置 JVM 的 JMS 監控的端口
-Dcom.sun.management.jmxremote.ssl=false 設置 JVM 的 JMS 監控不實用
SSL
-Dcom.sun.management.jmxremote.authenticate=false 設置 JVM 的 JMS 監
控不須要認證
IBM ISA,JProfiler、probe 等,具體監控及分析方式去網上搜索便可
這個能夠直接從 Tomcat 的 web 管理界面去查看便可 ;
或者藉助於第三方工具 Lambda Probe 來查看,它相對於 Tomcat 自帶的管理
稍微多了點功能,但也很少 ;
使用 JDK 自帶的 jconsole 能夠比較明瞭的看到內存的使用狀況,線程的狀態,
當前加載的類的總量等;
JDK 自帶的 jvisualvm 能夠下載插件(如 GC 等),能夠查看更豐富的信息。
若是是分析本地的 Tomcat 的話,還能夠進行內存抽樣等,檢查每一個類的使用
狀況
這個能夠經過配置 JVM 的啓動參數,打印這些信息(到屏幕(默認也會到
catalina.log 中)或者文件),具體參數以下:
-XX:+PrintGC:輸出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] -XX:+PrintGCDetails:輸出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps 可與上面兩個
混合使用,輸出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960
secs]
-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中斷
的執行時間。可與上面混合使用。輸出形式:Application time: 0.5291524
seconds
-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期間程序暫停的時間。
可與上面混合使用。輸出形式:Total time for which application threads were
stopped: 0.0468229 seconds
-XX:PrintHeapAtGC: 打印 GC 先後的詳細堆棧信息
-Xloggc:filename:與上面幾個配合使用,把相關日誌信息記錄到文件以便分析
-verbose:class 監視加載的類的狀況
-verbose:gc 在虛擬機發生內存回收時在輸出設備顯示信息
-verbose:jni 輸出 native 方法調用的相關狀況,通常用於診斷 jni 調用錯誤信息