總結之JVM調優(三)——Tomcat優化及代碼優化

部署Tomcat8.5

下載
https://tomcat.apache.org/download-80.cgi
上傳到linux並解壓
添加用戶信息
在conf/tomcat-users.xml加入

 <role rolename="manager"/>
  <role rolename="manager_gui"/>
  <role rolename="admin"/>
  <role rolename="admin_gui"/>
  <user username="tomcat" password="tomcat" roles="manager,manager_gui,admin,admin_gui"/>

在這裏插入圖片描述
將value的內容註釋
在這裏插入圖片描述
啓動tomcat
可以登錄管理了
在這裏插入圖片描述

禁用AJP

一般nignx+tomcat的架構,所以用不到AJP協議,所以禁用
在這裏插入圖片描述

線程池配置

在server.xml中配置

配置方式一

<Connector port="8080" acceptCount="100" maxConnections="200" 
            minSpareThreads="10" maxThreads="200"/>

acceptCount : 請求等待隊列大小,當tomcat沒有控線線程處理連接請求時,新的請求進入等待隊列,默認爲100,當超出 acceptCount後,新的請求被拒絕

maxConnections : tomcat能處理的最大併發連接數,超出進入等待隊列(acceptCount控制),連接會等待,不能被處理

minSpareThreads :線程池最小線程數,默認爲10,該配置指定線程池可以維持的空閒線程數量

maxThreads :線程池最大線程數,默認200,當線程池空閒後會釋放,保留minSpareThreads數量

配置方式二

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
 <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

tomcat默認是沒有開啓的 在server.xml裏面 是被註釋的需要手動開啓

namePrefix:創建的Tomcat線程名字的前綴

minSpareThreads :線程池最小線程數,默認爲4

maxThreads :線程池最大線程數 默認爲150
Executor實現的線程池,可以有更豐富的配置 如下

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
          deamon="true"  maxThreads="150" minSpareThreads="4"
            maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE"
            prestartminSpareThreads="false"/>
 <Connector executor="tomcatThreadPool"
               port="8080" executorTerminationTimeoutMillis ="5000"/>

deamon : 是否守護線程運行,默認爲true

maxIdleTime :空閒線程的存活時間 默認爲60s,當線程空閒超時後,線程被回收

maxQueueSize :任務隊列最大大小,默認爲Integer.MAX_VALUE (2147483647 )這太大了 有點不合適

prestartminSpareThreads :是否在tomcat啓動時就創建minSpareThreads個線程放入線程池,默認爲false

executorTerminationTimeoutMillis :在停止executor時,等待請求處理線程終止的超時時間
maxQueueSize:最大等待線程(超過線程數的線程會等待)

三種運行模式

一、bio(blocking I/O)

即阻塞式I/O操作,表示Tomcat使用的是傳統的Java I/O操作(即java.io包及其子包)。是基於JAVA的HTTP/1.1連接器,Tomcat7以下版本在默認情況下是以bio模式運行的。一般而言,bio模式是三種運行模式中性能最低的一種。我們可以通過Tomcat Manager來查看服務器的當前狀態。(Tomcat7 或以下,在 Linux 系統中默認使用這種方式)
二、nio(new I/O)

是Java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的併發運行性能。

想運行在該模式下,直接修改server.xml裏的Connector節點,修改protocol爲

protocol=“org.apache.coyote.http11.Http11NioProtocol”
啓動後,就可以生效。

利用 Java 的異步請求 IO 處理,可以通過少量的線程處理大量的請求

三、apr
安裝起來最困難,但是從操作系統級別來解決異步的IO問題,大幅度的提高性能.
必須要安裝apr和native,直接啓動就支持apr。下面的修改純屬多餘,僅供大家擴充知識,但仍然需要安裝apr和native
如nio修改模式,修改protocol爲org.apache.coyote.http11.Http11AprProtocol

Tomcat8後面版本有nio2,速度更快
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />

調整JVM參數進行優化

修改垃圾收集器

選擇CMS收集器
linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入

JAVA_OPTS="-server -Xms2048m -Xmx2048m-Xss512 -XX:+UseConcMarkSweepGC"

windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入

set JAVA_OPTS="-server -Xms2048m -Xmx2048m-Xss512 -XX:+UseConcMarkSweepGC"

調整堆內存大小

8g機器爲例

CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms4096m -Xmx4096m -Xmn2048m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
-Dfile.encoding:默認文件編碼
 -server:表示這是應用於服務器的配置,JVM 內部會有特殊處理的
 -Xmx1024m:設置JVM最大可用內存爲1024MB
 -Xms1024m:設置JVM最小內存爲1024m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。
 -Xmn1024m:設置JVM新生代大小(JDK1.4之後版本)。一般-Xmn的大小是-Xms的1/2左右,不要設置的過大或過小,過大導致老年代變小,頻繁Full GC,過小導致minor GC頻繁。如果不設置-Xmn,可以採用-XX:NewRatio=2來設置,也是一樣的效果
 -XX:NewSize:設置新生代大小
 -XX:MaxNewSize:設置最大的新生代大小
 -XX:PermSize:設置永久代大小
 -XX:MaxPermSize:設置最大永久代大小
 -XX:NewRatio=4:設置年輕代(包括 Eden 和兩個 Survivor 區)與終身代的比值(除去永久代)。設置爲 4,則年輕代與終身代所佔比值爲 1:4,年輕代佔整個堆棧的 1/5
 -XX:MaxTenuringThreshold=10:設置垃圾最大年齡,默認爲:15。如果設置爲 0 的話,則年輕代對象不經過 Survivor 區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設置爲一個較大值,則年輕代對象會在 Survivor 區進行多次複製,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。需要注意的是,設置了 -XX:MaxTenuringThreshold,並不代表着,對象一定在年輕代存活15次才被晉升進入老年代,它只是一個最大值,事實上,存在一個動態計算機制,計算每次晉入老年代的閾值,取閾值和MaxTenuringThreshold中較小的一個爲準。
響

應和吞吐量提高

JVM 字節碼

javap

Jmeter壓力測試工具安裝及使用教程

https://www.cnblogs.com/monjeo/p/9330464.html

代碼優化

儘可能使用局部變量

調用方法時傳遞的參數以及在調用中創建臨時變量都保存在棧中速度較快,其他變量,如靜態變量、實例變量等,都在堆中創建,速度較慢。另外,棧中創建的變量,隨着方法的運行結束,這些內容都沒了,不需要額外的垃圾回收。
在這裏插入圖片描述
**加粗樣式**
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章