天天看點

MyEclipse,MySQL調優,JVM調優,Tomcat調優MyEclipseMySQL調優JVM調優Tomcat調優

MyEclipse,MySQL調優,JVM調優,Tomcat調優

  • MyEclipse
    • myeclipse.ini檔案
    • 解決MyEclipse記憶體溢出(out of memory)問題
    • 優化MyEclipse速度(主要方法)
  • MySQL調優
    • SQL執行計劃
    • SQL語句優化
  • JVM調優
    • JVM記憶體區域
      • 方法區(線程共享)
      • 堆(線程共享)
      • 虛拟機棧(線程私有)
      • 本地方法棧(線程私有)
      • 程式計數器(線程私有)
    • JMM(Java記憶體模型)
      • 主記憶體
      • 工作記憶體
      • 原子性,可見性,有序性
  • Tomcat調優
    • Tomcat安裝
    • Tomcat目錄
    • Tomcat配置檔案
      • server.xml
      • web.xml
      • tomcat-users.xml
    • Tomcat類加載
    • Tomcat啟動問題
      • Linux下Tomcat8啟動很慢
    • MyEclipse內建外部應用伺服器
    • Tomcat配置
      • 配置域名(對應1)
      • 配置端口(對應2)
      • 配置虛拟目錄(對應3)
      • 自動生成虛拟路徑(對應4)預設通路檔案
      • 建立檔案伺服器
    • 四種線程模式
    • Tomcat記憶體優化
    • Tomcat并發優化
    • Tomcat緩存優化

MyEclipse

myeclipse.ini檔案

myeclipse.ini檔案

位于安裝路徑根目錄下

#utf8 (do not remove)
-startup
../Common/plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
../Common/plugins/org.eclipse.equinox.launcher.i18n.win32.win32.x86_4.2.0.v201201111650
-install                 //MyEclipse安裝路徑
d:\MyEclipse\MyEclipse 10
-vm                      //虛拟機路徑
d:\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\javaw.exe
-configuration           //MyEclipse配置路徑
d:\MyEclipse\MyEclipse 10\configuration
-vmargs                  //設定JVM參數,後面的參數都是JVM的參數
-Xms128m                 //JVM可配置設定的最小記憶體,預設是實體記憶體的1/64
-Xmx512m                 //JVM可配置設定的最大記憶體,預設是實體記憶體的1/4

//預設空餘堆記憶體小于40%時,JVM就會增大堆直到-Xmx的最大限制;空餘堆記憶體大于70%時,JVM會減少堆直到-Xms的最小限制。是以伺服器一般設定-Xms、-Xmx相等以避免在每次GC 後調整堆的大小

-XX:PermSize=256m		 //設定非堆記憶體初始值,預設是實體記憶體的1/64
-XX:MaxPermSize=512m     //設定最大非堆記憶體的大小,預設是實體記憶體的1/4
-XX:ReservedCodeCacheSize=64m      //緩存
-Dosgi.nls.warnings=ignore
           

解決MyEclipse記憶體溢出(out of memory)問題

<1>打開MyEclipse安裝目錄下的myeclipse.ini檔案修改JVM參數

<2>設定Default VM Arguments(預設VM參數)

MyEclipse—Windows—Preferences—Java—Installed JREs—點選正在使用的JDK—Edit—Default VM Arguments 輸入 -Xms64m -Xmx256m —Finish

<3>如果為WEB工程,還需設定tomcat記憶體

MyEclipse—Windows—Preferences—MyEclipse—Servers—Tomcat

—Tomcat 7.x—Optional java arguments—參數—Apply—OK

參數:-server -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxNewSize=512m -XX:MaxPermSize=256m -Djava.awt.headless=true

優化MyEclipse速度(主要方法)

<1>修改myeclipse.ini,加大JVM非堆記憶體

<2>Windows—Perferences—MyEclipse—點選Validation—去掉Build下的對号

需要驗證某個檔案:在檔案上右擊—MyEclipse—Run Validation

MySQL調優

SQL執行計劃

執行計劃是資料庫根據SQL語句和相關表的資訊作出的一個查詢方案,這個方案是由查詢優化器自動分析産生的。比如SQL語句如果從百萬條記錄中查找某條記錄,查詢優化器會選擇“索引查找”方式,如果該表進行了歸檔,隻剩下1000條記錄,那查詢優化器就會改變方案,采用 “全表掃描”方式
SQL語句前加EXPLAIN
列名 說明
id 查詢中操作表的順序,按順序從大到小依次執行,id值相同執行順序從上到下,id值不同時id值大的先執行
select_type
MyEclipse,MySQL調優,JVM調優,Tomcat調優MyEclipseMySQL調優JVM調優Tomcat調優
table 要操作的表
type ALL(全表掃描), index(索引掃描),range(範圍掃描),ref (非唯一索引掃描),eq_ref(唯一索引掃描,),(const)常數引用, 通路速度依次由慢到快
possible_keys 指出MySQL能使用哪些索引來優化查詢,查詢所涉及的列上的索引都會被列出,但不一定會被使用
key 顯示MySQL實際使用的索引,其中就包括主鍵索引(PRIMARY),或者自建索引的名字,如果沒有可用的索引,則顯示為NULL
key_len 表示索引字段的最大可能長度,KEY_LEN的長度由字段定義計算而來,并非資料的實際長度,當 key 字段的值為 null時,索引的長度就是 null
ref 連接配接比對條件,如果走主鍵索引的話,該值為: const, 全表掃描的話,為null值,表示哪些列或常量被用于查找索引列上的值
rows 掃描行數,也就是說,需要掃描多少行,才能擷取目标行數,一般情況下會大于傳回行數。通常情況下,rows越小,效率越高, 也就有大部分SQL優化,都是在減少這個值的大小
Extra
MyEclipse,MySQL調優,JVM調優,Tomcat調優MyEclipseMySQL調優JVM調優Tomcat調優

SQL語句優化

SQL線上壓縮/格式化工具:

http://tools.jb51.net/code/sql_format_compress

sql代碼線上格式化美化工具:

http://tools.jb51.net/code/sqlcodeformat

1:減少*的使用。使用*會增加解析的時間,另外會把不需要的資料也給查詢出來,資料傳輸也是耗費時間的

2:通過變量來設定參數。資料庫的SQL文解析和執行計劃會儲存在緩存中,但是SQL隻要有變化,就得重新解析

select * from user where id = ?

3:謹慎使用模糊查詢。當模糊比對以%開頭時,該列索引将失效,若不以%開頭,該列索引有效

4:不要使用列号。使用列号的話,将會增加不必要的解析時間

5:優先使用UNION ALL,避免使用UNION。前提是滿足需求

6:在where語句或者order by語句中避免對索引字段進行計算操作

7:使用not exist代替not in。not extst 的子查詢依然能用到表上的索引

8:合理使用exist和in。in 是把外表和内表作hash 連接配接,而exist是對外表作loop循環,每次loop循環再對内表進行查詢。是以,in用到的是外表的索引, exist用到的是内表的索引

A小B大

A in B 效率低

A exist B 效率高

B in A 效率高

B exist A 效率低

9:複雜操作考慮适當拆分

10:避免在索引字段上使用<>,!=,IS NULL,IS NOT NULL

避免在索引列上出現資料類型轉換

11:where子句中盡量避免對字段進行表達式操作,函數操作,!=,<>或null值判斷,如果表中該資料為null,可設定預設值,where temp = 0。

12:where子句避免or連接配接,可以用union all代替

13:對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引

JVM調優

JVM記憶體區域

JVM 記憶體:運作時資料區

方法區(Method Area)

堆(Heap)

虛拟機棧(VM Stack)

本地方法棧(Native Method Stack)

程式計數器(Program Counter Register)

JDK1.8已經不存在方法區,增加了元空間(中繼資料區)

由所有線程共享的資料區:方法區,堆

線程隔離的資料區:其餘三個

方法區(線程共享)

方法區屬于線程共享的記憶體區域,又稱Non-Heap(非堆),主要用于存儲已被虛拟機加載的類資訊、常量、靜态變量、即時編譯器編譯後的代碼等資料,根據Java 虛拟機規範的規定,當方法區無法滿足記憶體配置設定需求時,将抛出OutOfMemoryError 異常。值得注意的是在方法區中存在一個叫運作時常量池(Runtime Constant Pool)的區域,它主要用于存放編譯器生成的各種字面量和符号引用,這些内容将在類加載後存放到運作時常量池中,以便後續使用

堆(線程共享)

被所有線程共享的一塊記憶體區域,在虛拟機啟動的時候建立,用于存放對象執行個體

對可以按照可擴充來實作(通過-Xmx 和-Xms 來控制)

當隊中沒有記憶體可配置設定給執行個體,也無法再擴充時,抛出OutOfMemoryError異常

虛拟機棧(線程私有)

每個方法在執行的時候也會建立一個棧幀,存儲了局部變量,操作數,動态連結,方法傳回位址

每個方法從調用到執行完畢,對應一個棧幀在虛拟機棧中的入棧和出棧

通常所說的棧,一般是指在虛拟機棧中的局部變量部分,局部變量所需記憶體在編譯期間完成配置設定

如果線程請求的棧深度大于虛拟機所允許的深度,抛出StackOverflowError異常

如果虛拟機棧可以動态擴充,擴充到無法申請足夠的記憶體,抛出OutOfMemoryError異常

本地方法棧(線程私有)

和虛拟機棧類似,主要為虛拟機使用到的Native方法服務。也會抛出StackOverflowError 和OutOfMemoryError

程式計數器(線程私有)

是一小塊記憶體空間,主要代表目前線程所執行的位元組碼行号訓示器。位元組碼解釋器工作時,通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、循環、跳轉、異常處理、線程恢複等基礎功能都需要依賴這個計數器來完成

JMM(Java記憶體模型)

本身是一種抽象的概念,并不真實存在,它描述的是一組規則或規範,通過這組規範定義了程式中各個變量(包括執行個體字段,靜态字段和構成數組對象的元素)的通路方式。由于JVM運作程式的實體是線程,而每個線程建立時JVM都會為其建立一個工作記憶體(有些地方稱為棧空間),用于存儲線程私有的資料,而Java記憶體模型中規定所有變量都存儲在主記憶體,主記憶體是共享記憶體區域,所有線程都可以通路,但線程對變量的操作(讀取指派等)必須在工作記憶體中進行,首先要将變量從主記憶體拷貝的自己的工作記憶體空間,然後對變量進行操作,操作完成後再将變量寫回主記憶體,不能直接操作主記憶體中的變量,工作記憶體中存儲着主記憶體中的變量副本拷貝,前面說過,工作記憶體是每個線程的私有資料區域,是以不同的線程間無法通路對方的工作記憶體,線程間的通信(傳值)必須通過主記憶體來完成

主記憶體

主要存儲的是Java執行個體對象,所有線程建立的執行個體對象都存放在主記憶體中,不管該執行個體對象是成員變量還是方法中的本地變量(也稱局部變量),當然也包括了共享的類資訊、常量、靜态變量。由于是共享資料區域,多條線程對同一個變量進行通路可能會發現線程安全問題

工作記憶體

主要存儲目前方法的所有本地變量資訊(工作記憶體中存儲着主記憶體中的變量副本拷貝),每個線程隻能通路自己的工作記憶體,即線程中的本地變量對其它線程是不可見的,就算是兩個線程執行的是同一段代碼,它們也會各自在自己的工作記憶體中建立屬于目前線程的本地變量,當然也包括了位元組碼行号訓示器、相關Native方法的資訊。注意由于工作記憶體是每個線程的私有資料,線程間無法互相通路工作記憶體,是以存儲在工作記憶體的資料不存線上程安全問題

對于一個執行個體對象中的成員方法而言,如果方法中包含本地變量是基本資料類型(boolean,byte,short,char,int,long,float,double),将直接存儲在工作記憶體的幀棧結構中,但倘若本地變量是引用類型,那麼該變量的引用會存儲在功能記憶體的幀棧中,而對象執行個體将存儲在主記憶體(共享資料區域,堆)中。但對于執行個體對象的成員變量,不管它是基本資料類型或者包裝類型(Integer、Double等)還是引用類型,都會被存儲到堆區。至于static變量以及類本身相關資訊将會存儲在主記憶體中。需要注意的是,在主記憶體中的執行個體對象可以被多線程共享,倘若兩個線程同時調用了同一個對象的同一個方法,那麼兩條線程會将要操作的資料拷貝一份到自己的工作記憶體中,執行完成操作後才重新整理到主記憶體

原子性,可見性,有序性

原子性指的是一個操作是不可中斷的,即使是在多線程環境下,一個操作一旦開始就不會被其他線程影響。比如對于一個靜态變量int x,兩條線程同時對他指派,線程A指派為1,而線程B指派為2,不管線程如何運作,最終x的值要麼是1,要麼是2,線程A和線程B間的操作是沒有幹擾的,這就是原子性操作,不可被中斷的特點。有點要注意的是,對于32位系統的來說,long類型資料和double類型資料(對于基本資料類型,byte,short,int,float,boolean,char讀寫是原子操作),它們的讀寫并非原子性的,也就是說如果存在兩條線程同時對long類型或者double類型的資料進行讀寫是存在互相幹擾的,因為對于32位虛拟機來說,每次原子讀寫是32位的,而long和double則是64位的存儲單元,這樣會導緻一個線程在寫時,操作完前32位的原子操作後,輪到B線程讀取時,恰好隻讀取到了後32位的資料,這樣可能會讀取到一個既非原值又不是線程修改值的變量,它可能是“半個變量”的數值,即64位資料被兩個線程分成了兩次讀取。但也不必太擔心,因為讀取到“半個變量”的情況比較少見,至少在目前的商用的虛拟機中,幾乎都把64位的資料的讀寫操作作為原子操作來執行,是以對于這個問題不必太在意,知道這麼回事即可

可見性指的是當一個線程修改了某個共享變量的值,其他線程是否能夠馬上得知這個修改的值。對于串行程式來說,可見性是不存在的,因為我們在任何一個操作中修改了某個變量的值,後續的操作中都能讀取這個變量值,并且是修改過的新值。但在多線程環境中可就不一定了,前面我們分析過,由于線程對共享變量的操作都是線程拷貝到各自的工作記憶體進行操作後才寫回到主記憶體中的,這就可能存在一個線程A修改了共享變量x的值,還未寫回主記憶體時,另外一個線程B又對主記憶體中同一個共享變量x進行操作,但此時A線程工作記憶體中共享變量x對線程B來說并不可見,這種工作記憶體與主記憶體同步延遲現象就造成了可見性問題,另外指令重排以及編譯器優化也可能導緻可見性問題,通過前面的分析,我們知道無論是編譯器優化還是處理器優化的重排現象,在多線程環境下,确實會導緻程式輪序執行的問題,進而也就導緻可見性問題

有序性是指對于單線程的執行代碼,我們總是認為代碼的執行是按順序依次執行的,這樣的了解并沒有毛病,畢竟對于單線程而言确實如此,但對于多線程環境,則可能出現亂序現象,因為程式編譯成機器碼指令後可能會出現指令重排現象,重排後的指令與原指令的順序未必一緻,要明白的是,在Java程式中,倘若在本線程内,所有操作都視為有序行為,如果是多線程環境下,一個線程中觀察另外一個線程,所有操作都是無序的,前半句指的是單線程内保證串行語義執行的一緻性,後半句則指指令重排現象和工作記憶體與主記憶體同步延遲現象

Tomcat調優

Tomcat安裝

(1)将apache-tomcat-6.0.14.zip解壓到任意目錄

(2)設定環境變量JAVA_HOME,值為jdk所在目錄

設定環境變量的方法:右擊我的電腦-屬性-進階-環境變量-系統變量-建立-設定變量名和變量值

(3)輕按兩下tomcat6\bin\startup.bat指令啟動tomcat服務,關閉啟動視窗或輕按兩下shutdown.bat指令關閉服務

(4)安裝Tomcat并啟動服務,然後在浏覽器位址欄中輸入URL:http://localhost:8080 出現畫面表明tomcat安裝成功,端口可以檢視

Tomcat目錄

目錄 詳解
/bin

存放tomcat的指令:.sh結尾(linux指令),.bat結尾(windows指令)

startup:啟動tomcat,shutdown:關閉tomcat,catalina可設定tomcat記憶體

很多環境變量是設定都在此處,可以設定JDK路徑,TOMCAT路徑

/conf

存放Tomcat的配置檔案

web.xml:可以設定tomcat支援的檔案類型

tomcat-users.xml:管理tomcat使用者與權限

在Catalina目錄下可以設定預設加載的項目

context.xml:可以用來配置資料源(資料庫等等)的各種資訊

server.xml:可以設定端口号,域名,IP,預設加載的項目,請求編碼等等

/lib 存放Tomcat伺服器及所有Web應用程式都可以通路的jar包
/logs

存放Tomcat的日志檔案

windows環境下:catalina.xxxx-xx-xx.log,linux環境下:catalina.out

(清空此目錄下的檔案不會對tomcat運作帶來影響)

/temp

存放Tomcat運作時産生的臨時檔案

(清空此目錄下的檔案不會對tomcat運作帶來影響)

/webapps 通常把Web應用程式的目錄及檔案放到這個目錄下,預設的
/work

Tomcat将JSP生成的源檔案和位元組碼檔案放到這個目錄下(工作目錄)

删除此目錄下的所有檔案,重新開機tomcat,達到清除緩存的作用

在startup.bat的開頭加 rd/s/q “X:\Tomcat\work\Catalina” 路徑自配

Tomcat配置檔案

server.xml

Server:

1:port 指定一個端口,這個端口負責監聽關閉tomcat的請求

2:shutdown 指定向端口發送的指令字元串

<Server port="8007" shutdown="SHUTDOWN"></Server>

Service:

1:name 指定service的名字

<Service name="Catalina"></Service>

Connector (表示用戶端和service之間的連接配接):

1:port 指定伺服器端要建立的端口号,并在此端口監聽來自用戶端的請求

2:minProcessors 伺服器啟動時建立的處理請求的線程數

3:maxProcessors 最大可以建立的處理請求的線程數

4:enableLookups 如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠端用戶端的實際主機名,若為false則不進行DNS查詢,而是傳回其ip位址

5:redirectPort 指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的端口号

6:acceptCount 指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求将不予處理

7:connectionTimeout 指定逾時的時間數(以毫秒為機關)

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="GBK" />
           

Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求):

1:defaultHost 指定預設的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的

<Engine name="Catalina" defaultHost="localhost">
</Engine>
           

Context (表示一個web應用程式):

1;docBase 應用程式的路徑或者是WAR檔案存放的路徑

2:path 表示此web應用程式的url的字首,這樣請求的url為http://localhost:8080/path/****

3:reloadable 這個屬性非常重要,如果為true,則tomcat會自動檢測應用程式的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程式,我們可以在不重起tomcat的情況下改變應用程式

Host (表示一個虛拟主機):

1:name 指定主機名

2:appBase 應用程式基本目錄,即存放應用程式的目錄

3:unpackWARs 如果為true,則tomcat會自動将WAR檔案解壓,否則不解壓,直接

Logger (表示日志,調試和錯誤資訊):

1:className 指定logger使用的類名,此類必須實作org.apache.catalina.Logger 接口

2:prefix 指定log檔案的字首

3:suffix 指定log檔案的字尾

4:timestamp 如果為true,則log檔案名中要加入時間,如下例:localhost_log.2001-10-04.txt

Realm (表示存放使用者名,密碼及role的資料庫):

1:className 指定Realm使用的類名,此類必須實作org.apache.catalina.Realm接口

Valve (功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣):

1:className 指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程式的通路資訊

2:directory(指定log檔案存放的位置):

3:pattern 有兩個值,common方式記錄遠端主機名或ip位址,使用者名,日期,第一行請求的字元串,HTTP響應代碼,發送的位元組數。combined方式比common方式記錄的值更多

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
           

web.xml

預設檔案的設定
<welcome-file-list>
	<welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
           
報錯檔案的設定

如果某檔案資源沒有找到,伺服器要報404錯誤,按下面配置則會調用\webapps\ROOT\notFileFound.jsp

如果執行的某個JSP檔案産生NullPointException ,則會調用\webapps\ROOT\null.jsp

<error-page>
	<error-code>404</error-code>
	<location>/notFileFound.jsp</location>
</error-page>
<error-page>
	<exception-type>java.lang.NullPointerException</exception-type>
	<location>/null.jsp</location>
</error-page>
           

會話逾時的設定

設定session 的過期時間,機關是分鐘

<session-config>
	<session-timeout>30</session-timeout>
</session-config>
           
過濾器的設定

tomcat-users.xml

Tomcat類加載

加載類和資源的順序為:

1、/Web-INF/classes

2、/Web-INF/lib/.jar

3、Bootstrap

4、System

5、$CATALINA_HOME/common/classes

6、$CATALINA_HOME/common/endores/.jar

7、$CATALINA_HOME/common/lib/.jar

8、$CATALINA_HOME/shared/classes

9、$CATALINA_HOME/shared/lib/.jar

Tomcat啟動問題

一閃而過:沒有配置環境變量JAVA_HOME

啟動過程中出現很多異常:因為端口被占用了

win+R—cmd—輸入netstat -a -o -n 查找8080的pid

—在任務管理器中結束程序

更改Tomcat的預設端口:路徑:Tomcat\conf\server.xml

<Connector port=“8080” protocol=“HTTP/1.1”

connectionTimeout=“60000”

redirectPort=“8443” URIEncoding=“GBK” / >

Linux下Tomcat8啟動很慢

1:可以通過配置JRE使用非阻塞的Entropy Source

在catalina.sh中加入:

-Djava.security.egd=file:/dev/./urandom

2:打開$JAVA_PATH/jre/lib/security/java.security這個檔案

找到下面的内容:

securerandom.source=file:/dev/urandom

替換為

securerandom.source=file:/dev/./urandom

MyEclipse內建外部應用伺服器

Window—Preferences—MyEclipse—Servers—

Tomcat—Tomcat6.x

勾選Enable—設定Tomcat home directory D:\apache-tomcat-6.0.14

—後面兩欄自動補充—Apply—OK

Tomcat配置

MyEclipse預設Tomcat

Window—Preferences—MyEclipse—Servers—Integrated Sandbox

—MyEclipse Tomcat 6 右側有位址

預設位址:D:\MyWorkSpace\.metadata\.me_tcat目錄下,路徑自配

http://localhost:8080/項目名/   (預設進入welcome中的頁面)

                1         2         3                             4

配置域名(對應1)

設計自己的域名,在server.xml中添加一個Host标簽

修改name,Context标簽下面會說到
<Host name="www.xxx.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/" docBase="D:\MyWorkSpace\.metadata\.me_tcat\webapps\test" reloadadble="true"/>
</Host>
           

C:\Windows\System32\drivers\etc\hosts中添加(位址固定)

127.0.0.1 www.xxx.com    前面的位址自配

ping www.xxx.com

ping通,重新開機Tomcat

通路:http://www.xxx.com:8080/

配置端口(對應2)

<Connector port="8080" protocol="HTTP/1.1"
			connectionTimeout="20000"
            redirectPort="8443" URIEncoding="GBK" />
           
修改port即可

配置虛拟目錄(對應3)

方式一:直接修改server.xml配置檔案(需要重新啟動Tomcat,不推薦)

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
<!--     虛拟目錄      實際目錄    -->
<Context path="/xxx" docBase="D:\MyWorkSpace\.metadata\.me_tcat\webapps\test" 
reloadadble="true"/>
<!--java檔案是否自動更新加載    -->
<!--把/xxx這個虛拟路徑映射到D:\MyWorkSpace\.metadata\.me_tcat\webapps\test目錄下-->
           
通路http://localhost:8080/xxx/

方式二:在conf目錄下建立Catalina目錄,在此目錄下建立localhost目錄

在localhost目錄下建立aaa.xml,内容為:

<?xml version="1.0"?>
<Context docBase="D:\MyWorkSpace\.metadata\.me_tcat\webapps\test" reloadadble="true"/>
           

通路http://localhost:8080/aaa/

不需要寫path,虛拟目錄就是檔案名aaa,path預設為/aaa

添加aaa.xml不需要重新開機tomcat伺服器

自動生成虛拟路徑(對應4)預設通路檔案

将web項目直接放到tomcat的webapps目錄下,tomcat會根據檔案夾名稱自動生成虛拟路徑,配置web.xml

<web-app>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>
           

通路http://localhost:8080/項目名/

即可進入設定好的界面

建立檔案伺服器

修改web.xml中的listings的value的值為true

--                                 實際目錄
<Context path="/download" docBase="F:\1"/>
           

通路http://localhost:8080/download/

四種線程模式

server.xml

<Connector port="8080" protocol="HTTP/1.1"/>

BIO: protocol ="org.apache.coyote.http11.Http11Protocol"
NIO: protocol ="org.apache.coyote.http11.Http11NioProtocol"
AIO: protocol ="org.apache.coyote.http11.Http11Nio2Protocol"
APR: protocol ="org.apache.coyote.http11.Http11AprProtocol"
           
簡稱 說明
BIO

阻塞式IO,采用傳統的java IO進行操作,該模式下每個請求都會建立一個線程,适用于并發量小的場景,缺點:并發量高時,線程數較多,浪費資源

Tomcat7或以下,在Linux系統中預設使用這種方式

NIO

同步非阻塞,比傳統BIO能更好的支援大并發

可以通過少量的線程處理大量的請求

Tomcat 8.0 後預設使用這種方式

AIO

異步非阻塞(Apache Portable Runtime),從作業系統層面解決io阻塞問題

Tomcat8.0後支援,Tomcat7或Tomcat8在Win7或以上的系統中預設使用這種方式

APR tomcat 以JNI形式調用http伺服器的核心動态連結庫來處理檔案讀取或網絡傳輸操作,需要編譯安裝APR庫,必須要安裝apr和native

Tomcat記憶體優化

Tomcat安裝目錄\bin\catalina.bat(window系統)或catalina.sh(linux系統)

添加參數,注意所有參數要依據電腦組態,并不是越大越好

JAVA_OPTS="-server -Xms1024M -Xmx2048M -Xss128k -XX:+AggressiveOpts -XX:+UseCMSCompactAtFullCollection -XX:+UseBiasedLocking 
-XX:+UseParNewGC -XX:NewSize=400M -XX:MaxNewSize=512M -XX:PermSize=128M -XX:MaxPermSize=256M"
           
類型 說明
-server 伺服器模式
-Xms java虛拟機初始化最小記憶體
-Xmx java虛拟機可用最大記憶體
-Xss 每個java線程堆棧大小
-XX:+AggressiveOpts 啟用這個參數,則每當 JDK 版本更新時,你的 JVM 都會使用最新加入的優化技術
-XX:+UseCMSCompactAtFullCollection 在使用 concurrent gc 的情況下,防止 memoryfragmention,對 live object 進行整理,使 memory 碎片減少
-XX:+UseBiasedLocking 啟用一個優化了的線程,使得你的appserver内對線程處理自動進行最優調配
-XX:+UseParNewGC 對新生代采用多線程并行回收
-XX:PermSize 記憶體永久保留區域
-XX:MaxPermSize 記憶體最大永久保留區域
-XX:NewSize 堆區域新生代記憶體的預設大小
-XX:MaxNewSize JVM堆區域新生代記憶體的最大可配置設定大小

Tomcat并發優化

Tomcat安裝目錄\conf\server.xml
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
                minSpareThreads="10"
                maxSpareThreads="100"
                maxThreads="800"
                acceptCount="800"
                enableLookups="false"
                disableUploadTimeout="false"
                connectionUploadTimeout="100000"
                keepAliveTimeout="70000"
                URIEncoding="UTF-8"
                connectionTimeout="10000" />
           
類型 說明
minSpareThreads Tomcat初始化時建立的 socket 線程數
maxSpareThreads Tomcat連接配接器的最大空閑 socket 線程數
maxThreads 客戶請求最大線程數
acceptAccount 監聽端口隊列最大數,滿了之後客戶請求會被拒絕(不能小于maxSpareThreads)
enableLookups 是否反查域名,取值為:true或false。為了提高處理能力,應設定為false
disableUploadTimeout 上傳時是否使用逾時機制
connectionUploadTimeout 上傳逾時時間
keepAliveTimeout 長連接配接最大保持時間(毫秒)
URIEncoding Tomcat容器的URL編碼格式
connectionTimeout 網絡連接配接逾時,機關:毫秒

Tomcat緩存優化

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
				compression="on" compressionMinSize="2048"
                compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
                minSpareThreads="10"
                maxSpareThreads="100"
                maxThreads="800"
                acceptCount="800"
                enableLookups="false"
                disableUploadTimeout="false"
                connectionUploadTimeout="100000"
                keepAliveTimeout="70000"
                URIEncoding="UTF-8"
                connectionTimeout="10000" />
           
類型 說明
compression 打開壓縮功能
compressionMinSize 啟用壓縮的輸出内容大小,這裡面預設為2KB
compressableMimeType 壓縮檔案類型