tomcat7 性能优化
1.??目的
通過優(yōu)化tomcat提高網(wǎng)站的并發(fā)能力。當(dāng)我們今天我們將這個優(yōu)化講完之前? 優(yōu)化完成后看能達(dá)到什么層次。
?
?
2.??服務(wù)器資源
服務(wù)器所能提供CPU、內(nèi)存、硬盤的性能對處理能力有決定性影響。硬件我們不說了 這個方面是錢越多越好是吧。
3.??優(yōu)化配置
3.1. 配置tomcat管理員賬戶
在conf/ tomcat-users.xml下添加用戶:
?
<role rolename="manager"/>
<rolerolename="manager-gui"/>
<role rolename="admin"/>
<rolerolename="admin-gui"/>
<user username="tomcat"password="tomcat"roles="admin-gui,admin,manager-gui,manager"/>
?
啟動tomcat,登錄查看信息:
http://127.0.0.1:8080/
?
?
?
ajp-服務(wù)器之間的通信協(xié)議,socket層? 然后組裝一定的數(shù)據(jù)給對方 數(shù)據(jù)形式也可能json? xml 文本 只是各個廠家約定的,例如我們在一個物理主機跑三個TOMCAT服務(wù)器的時候是吧,這個負(fù)載均衡? 通過權(quán)數(shù)和算法
?
3.2. tomcat的3種運行模式
tomcat的運行模式有3種:
1、? bio
默認(rèn)的模式,性能非常低下,沒有經(jīng)過任何優(yōu)化處理和支持. 一個線程處理一個請求。缺點:并發(fā)量高時,線程數(shù)較多,浪費資源。
Tomcat7或以下,在Linux系統(tǒng)中默認(rèn)使用這種方式。
?
2、??nio
nio(new I/O),是Java SE 1.4及后續(xù)版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基于緩沖區(qū)、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統(tǒng)I/O操作(bio)更好的并發(fā)運行性能。
利用Java的異步IO處理,可以通過少量的線程處理大量的請求。
Tomcat8在Linux系統(tǒng)中默認(rèn)使用這種方式。
Tomcat7必須修改Connector配置來啟動:
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"
????????connectionTimeout="20000" redirectPort="8443"/>
3、? apr
安裝起來最困難,但是從操作系統(tǒng)級別來解決異步的IO問題,大幅度的提高性能.
即Apache PortableRuntime,從操作系統(tǒng)層面解決io阻塞問題。
Tomcat7或Tomcat8在Win7或以上的系統(tǒng)中啟動默認(rèn)使用這種方式。
Linux如果安裝了apr和native,Tomcat直接啟動就支持apr。
具體安裝辦法 參見這個地址:https://my.oschina.net/lsw90/blog/181161
4、? 在那里看我們的tomcat以何種工作模式啟動的啊?
Tomcat啟動的時候,可以通過log看到Connector使用的是哪一種運行模式:
StartingProtocolHandler ["http-bio-8080"]
StartingProtocolHandler ["http-nio-8080"]
StartingProtocolHandler ["http-apr-8080"]
3.2.1.??啟動NIO模式
修改server.xml里的Connector節(jié)點,修改protocol為org.apache.coyote.http11.Http11NioProtocol
? 這里有個問題啊? 為什么它不直接改成NIO的形式呢?
?????? 這個方式是利用了jdk?1.4及后續(xù)版本提供的一種新的I/O操作方式(即java.nio包及其子包)為橋梁實現(xiàn)的,不改成這種優(yōu)化方式就是為了兼容1.4之前的JAVA項目也能跑起來。
?
3.3. 執(zhí)行器(線程池)
默認(rèn)的tomcat沒有啟用線程池,
在tomcat中每一個用戶請求都是一個線程,所以可以使用線程池提高性能。這里前臺其實有一個調(diào)度線程,然后調(diào)度線程會放入線程池內(nèi),然后到到一定的時候線程池的任務(wù)變成工作線程啊。
?
3.3.1.??開啟并且使用
配置:
?
?
3.3.2.??參數(shù)說明
http://127.0.0.1:8088/docs/config/http.html
| Attribute | Description |
| threadPriority?(優(yōu)先級) | (int)線程的線程優(yōu)先級執(zhí)行程序,默認(rèn)是5(NORM_PRIORITY常數(shù)) |
| daemon(守護(hù)進(jìn)程) | (布爾)是否應(yīng)該守護(hù)程序線程,線程默認(rèn)是true |
| namePrefix(名稱前綴) | (String) The name prefix for each thread created by the executor. The thread name for an individual thread will be?namePrefix+threadNumber |
| maxThreads(最大線程數(shù)) | (int) The max number of active threads in this pool, default is?200 |
| minSpareThreads(最小活躍線程數(shù)) | (int) The minimum number of threads always kept alive, default is?25 |
| maxIdleTime(空閑線程等待時間) | (int) The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less or equal to minSpareThreads. Default value is?60000(1 minute) 一個空閑的線程shutsdown之前的毫秒數(shù),除非活動線程的數(shù)量不等于minSpareThreads。默認(rèn)值為60000(1分鐘) |
| maxQueueSize(最大的等待隊里數(shù),超過則請求拒絕) | (int) The maximum number of runnable tasks that can queue up awaiting execution before we reject them. Default value is?Integer.MAX_VALUE 可運行的最大數(shù)量可以排隊等待執(zhí)行的任務(wù)之前,我們拒絕他們。默認(rèn)值是Integer.MAX_VALUE |
| prestartminSpareThreads (是否在啟動時就生成minSpareThreads個線程) | (boolean) Whether minSpareThreads should be started when starting the Executor or not, the default is?false minSpareThreads是否應(yīng)該開始在開始執(zhí)行程序,默認(rèn)是false |
| threadRenewalDelay (重建線程的時間間隔) | (long) If a?ThreadLocalLeakPreventionListener?is configured, it will notify this executor about stopped contexts. After a context is stopped, threads in the pool are renewed. To avoid renewing all threads at the same time, this option sets a delay between renewal of any 2 threads. The value is in ms, default value is?1000?ms. If value is negative, threads are not renewed. 。重建線程池內(nèi)的線程時,為了避免線程同時重建,每隔threadRenewalDelay(單位: ms )重建一個線程。默認(rèn)值為1000 ,設(shè)置為負(fù)則不重建 |
3.3.3.??最佳實踐
3.4.連接器(Connector)優(yōu)化
????????我們知道TOMCAT_HOME/conf/server.xml可以配置端口,虛擬路徑等等 Tomcat相關(guān)主要配置。
???????1.Connector 優(yōu)化
???????Connector是連接器,負(fù)責(zé)接收客戶的請求,以及向客戶端回送響應(yīng)的消息。所以 Connector的優(yōu)化是重要部分。默認(rèn)情況下 Tomcat只支持200線程訪問,超過這個數(shù)量的連接將被等待甚至超時放棄,所以我們需要提高這方面的處理能力。
???????修改這部分配置需要修改TOMCAT_HOME/conf/server.xml,打開server.xml找到Connector 標(biāo)簽項,默認(rèn)配置如下:
Xml代碼
<Connector port="8080"protocol="HTTP/1.1"?
??????????connectionTimeout="20000"?
??????????redirectPort="8443" />?
???????其中port代表服務(wù)接口;protocol代表協(xié)議類型;connectionTimeout代表連接超時時間,單位為毫秒;redirectPort代表安全通信(https)轉(zhuǎn)發(fā)端口,一般配置成443。
???????可以看到除了這幾個基本配置外并無特殊功能,所以我們需要對 Connector 進(jìn)行擴展。
???????其中Connector 支持參數(shù)屬性可以參考Tomcat官方網(wǎng)站(https://tomcat.apache.org/tomcat-8.0-doc/config/http.html),非常多,所以本文就只介紹些常用的。
???????我們將 Connector 配置修改為如下:
<Connector port="8080"??
?????????protocol="HTTP/1.1"??
?????????maxThreads="1000"??
?????????minSpareThreads="100"??
?????????acceptCount="1000"?
?????????maxConnections="1000"?
?????????connectionTimeout="20000"??
?????????maxHttpHeaderSize="8192"?
?????????tcpNoDelay="true"?
?????????compression="on"?
?????????compressionMinSize="2048"?
?????????disableUploadTimeout="true"?
?????????redirectPort="8443"?
?????????enableLookups="false"?
?????????URIEncoding="UTF-8" />?
?
Connector是Tomcat接收請求的入口,每個Connector有自己專屬的監(jiān)聽端口8088端口 接受http請求
?
Connector有兩種:HTTP Connector和AJPConnector
3.4.1.??通用屬性(高亮的是重點)
| Attribute | Description |
| allowTrace | A boolean value which can be used to enable or disable the TRACE HTTP method. If not specified, this attribute is set to false. 如果需要服務(wù)器能夠處理用戶的HAED/TRACE請求,這個值應(yīng)該設(shè)置為true,默認(rèn)值是false |
| asyncTimeout | The default timeout for asynchronous requests in milliseconds. If not specified, this attribute is set to 10000 (10 seconds). 默認(rèn)超不時候以毫秒為單位的異步懇求。若是沒有指定,該屬性被設(shè)置為10000(10秒)。 |
| enableLookups | Set to?true?if you want calls to?request.getRemoteHost()?to perform DNS lookups in order to return the actual host name of the remote client. Set to?false?to skip the DNS lookup and return the IP address in String form instead (thereby improving performance). By default, DNS lookups are disabled. 若是你想request.getRemoteHost()的調(diào)用 履行,以便返回的長途客戶端的實際主機名的DNS查詢,則設(shè)置為true。設(shè)置為false時跳過DNS查找,并返回字符串情勢的IP地址(從而提高性能)。默認(rèn)景象下,禁用DNS查找。 |
| maxHeaderCount | The maximum number of headers in a request that are allowed by the container. A request that contains more headers than the specified limit will be rejected. A value of less than 0 means no limit. If not specified, a default of 100 is used. 容器允許的請求頭字段的最大數(shù)目。請求中包含比指定的限制更多的頭字段將被拒絕。值小于0表示沒有限制。如果沒有指定,默認(rèn)設(shè)置為100。 |
| maxParameterCount | The maximum number of parameter and value pairs (GET plus POST) which will be automatically parsed by the container. Parameter and value pairs beyond this limit will be ignored. A value of less than 0 means no limit. If not specified, a default of 10000 is used. Note that?FailedRequestFilter?filtercan be used to reject requests that hit the limit. 將被容器自動解析的最大數(shù)量的參數(shù)和值對(GET加上POST)。參數(shù)值對超出此限制將被忽略。值小于0表示沒有限制。如果沒有指定,默認(rèn)為10000。請注意, FailedRequestFilter 過濾器可以用來拒絕達(dá)到了極限值的請求。 |
| maxPostSize | The maximum size in bytes of the POST which will be handled by the container FORM URL parameter parsing. The limit can be disabled by setting this attribute to a value less than or equal to 0. If not specified, this attribute is set to 2097152 (2 megabytes). 將被容器以FORM URL參數(shù)形式處理的最大長度(以字節(jié)為單位)的POST。通過設(shè)置此屬性的值小于或等于0可以禁用該限制。如果沒有指定,該屬性被設(shè)置為2097152(2兆字節(jié))。上傳提交的時候可以用的 |
| maxSavePostSize | The maximum size in bytes of the POST which will be saved/buffered by the container during FORM or CLIENT-CERT authentication. For both types of authentication, the POST will be saved/buffered before the user is authenticated. For CLIENT-CERT authentication, the POST is buffered for the duration of the SSL handshake and the buffer emptied when the request is processed. For FORM authentication the POST is saved whilst the user is re-directed to the login form and is retained until the user successfully authenticates or the session associated with the authentication request expires. The limit can be disabled by setting this attribute to -1. Setting the attribute to zero will disable the saving of POST data during authentication. If not specified, this attribute is set to 4096 (4 kilobytes). 將被容器在FORM或CLIENT-CERT認(rèn)證中保存/緩沖的POST的最大尺寸(以字節(jié)為單位)。對于這兩種類型的身份驗證,在用戶身份驗證之 前,POST將被保存/緩沖。對于POST CLIENT-CERT認(rèn)證,處理該請求的SSL握手和緩沖清空期間,POST將被緩存。對于Form認(rèn)證,POST將被保存,同時用戶將被重定向到登陸 表單。POST將被一直保留直到用戶成功認(rèn)證或者認(rèn)證請求關(guān)聯(lián)的會話超時。將此屬性設(shè)置為-1可以禁用此限制。將此屬性設(shè)置為0,POST數(shù)據(jù)在身份驗證 過程中將不被保存。如果沒有指定,該屬性設(shè)置為4096(4千字節(jié))。 |
| parseBodyMethods | A comma-separated list of HTTP methods for which request bodies will be parsed for request parameters identically to POST. This is useful in RESTful applications that want to support POST-style semantics for PUT requests. Note that any setting other than?POST?causes Tomcat to behave in a way that goes against the intent of the servlet specification. The HTTP method TRACE is specifically forbidden here in accordance with the HTTP specification. The default is?POST 以逗號分隔的HTTP方法列表,通過方法列表,等同于POST方法,request 正文將被解析成請求參數(shù)。這在RESTful應(yīng)用程序要支持以POST式的語義解析PUT請求中是非常有用的。需要注意的是設(shè)置其他值(不是POST)會導(dǎo)致Tomcat的行為違反servlet規(guī)范的目的。在這里為了符合HTTP規(guī)范明確禁止HTTP方法TRACE。默認(rèn)值是POST |
| port | The TCP port number on which this?Connector?will create a server socket and await incoming connections. Your operating system will allow only one server application to listen to a particular port number on a particular IP address. If the special value of 0 (zero) is used, then Tomcat will select a free port at random to use for this connector. This is typically only useful in embedded and testing applications. TCP端口號,連接器利用該端口號將創(chuàng)建一個服務(wù)器套接字,并等待傳入的連接。你的操作系統(tǒng)將只允許一個服務(wù)器應(yīng)用程序在一個特定的IP地址偵聽特定的端口號。如果使用特殊值0(零),則Tomcat將為連接器隨機選擇一個空閑的端口。這是通常只用在嵌入式和測試應(yīng)用程序。 |
| protocol | Sets the protocol to handle incoming traffic. The default value is?HTTP/1.1?which uses an auto-switching mechanism to select either a blocking Java based connector or an APR/native based connector. If the?PATH?(Windows) or?LD_LIBRARY_PATH?(on most unix systems) environment variables contain the Tomcat native library, the APR/native connector will be used. If the native library cannot be found, the blocking Java based connector will be used. Note that the APR/native connector has different settings for HTTPS than the Java connectors. 設(shè)置協(xié)議來處理傳入流量。默認(rèn)值是 HTTP/1.1,將使用自動切換機制來選擇阻塞的基于Java的連接器或APR /native 為基礎(chǔ)的連接器。如果PATH(Windows)或LD_LIBRARY_PATH(在大多數(shù)Unix系統(tǒng))的環(huán)境變量包含在Tomcat的本地庫里,APR /native 連接器將被使用。如果在本地庫中無法找到,阻斷基于Java的連接器將被使用。需要注意的是使用HTTPS比Java連接器與APR /native 連接器有不同的設(shè)置。一個明確的協(xié)議,而不是依靠上述自動切換機構(gòu),可用以下值:? 指定模式 org.apache.coyote.http11.Http11Protocol -阻塞式的Java連接器 ?也可以使用的用戶自定義的實現(xiàn)。看一看在我們的連接器比較圖。Java連接器,HTTP和HTTPS,配置是相同的。 APR連接器和APR特定的SSL設(shè)置的更多信息,請訪問APR文檔 |
| proxyName | If this?Connector?is being used in a proxy configuration, configure this attribute to specify the server name to be returned for calls to?request.getServerName(). See?Proxy Support?for more information. 如果這個連接正在使用的代理服務(wù)器配置,配置該屬性指定的服務(wù)器的名稱,可以調(diào)用request.getServerName()返回。有關(guān)更多信息,請參見代理支持。 |
| proxyPort | If this?Connector?is being used in a proxy configuration, configure this attribute to specify the server port to be returned for calls to?request.getServerPort(). See?Proxy Support?for more information. 如果這個連接正在使用的代理服務(wù)器配置,配置該屬性指定服務(wù)器端口,可以調(diào)用request.getServerPort()返回。有關(guān)更多信息,請參見代理支持。 |
| redirectPort | If this?Connector?is supporting non-SSL requests, and a request is received for which a matching<security-constraint>?requires SSL transport, Catalina will automatically redirect the request to the port number specified here. 如果該連接器支持非SSL請求,并且接收到的請求為滿足安全約束需要SSL傳輸, Catalina 將自動將請求重定向到指定的端口號。 |
| scheme | Set this attribute to the name of the protocol you wish to have returned by calls torequest.getScheme(). For example, you would set this attribute to "https" for an SSL Connector. The default value is "http". 將該屬性設(shè)置為你想調(diào)用request.getScheme()返回的協(xié)議的名稱。例如,對于SSL連接器,你會將此屬性設(shè)置為“HTTPS ”。默認(rèn)值是“ HTTP ”。 |
| secure | Set this attribute to?true?if you wish to have calls to?request.isSecure()?to return?true?for requests received by this Connector. You would want this on an SSL Connector or a non SSL connector that is receiving data from a SSL accelerator, like a crypto card, a SSL appliance or even a webserver. The default value is?false. 如果你想調(diào)用request.isSecure()收到此連接器的請求返回true,請該該屬性設(shè)置為true。您希望SSL連接器或非SSL連接器接收數(shù)據(jù)通過一個SSL加速器,像加密卡,SSL設(shè)備,甚至一個web服務(wù)器。默認(rèn)值是假的。 |
| URIEncoding | This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used. 解決我們的亂碼問題 這將指定使用的字符編碼??,來解碼URI字符。如果沒有指定,ISO-8859-1將被使用。 |
| useBodyEncodingForURI | This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is?false. 這指定是否應(yīng)該用于URI查詢參數(shù),而不是使用URIEncoding contentType中指定的編碼。此設(shè)置兼容性Tomcat 4.1.x版(該版在contentType中指定編碼,或者使用request.setCharacterEncoding的方法顯式設(shè)置(參數(shù)為 URL傳來的值)。默認(rèn)值false。 |
| useIPVHosts | Set this attribute to?true?to cause Tomcat to use the IP address that the request was received on to determine the Host to send the request to. The default value is?false. 將該屬性設(shè)置為true會導(dǎo)致Tomcat使用收到請求的IP地址,來確定將請求發(fā)送到哪個主機。默認(rèn)值是假的。 |
| xpoweredBy | Set this attribute to?true?to cause Tomcat to advertise support for the Servlet specification using the header recommended in the specification. The default value is?false. 將此屬性設(shè)置為true會導(dǎo)致Tomcat支持使用Servlet規(guī)范的通知,(在規(guī)范中推薦使用頭字段)。默認(rèn)值是假的。 |
?
3.4.2.??標(biāo)準(zhǔn)實現(xiàn)(高亮的是重點)
除了上面列出的常見的連接器屬性,標(biāo)準(zhǔn)的HTTP連接器(BIO,NIO和APR/native)都支持以下屬性。
?
| Attribute | Description |
| acceptCount | The maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full will be refused. The default value is 100. 當(dāng)所有可能的請求處理線程都在使用時,傳入連接請求的最大隊列長度。當(dāng)隊列滿時收到的任何請求將被拒絕。默認(rèn)值是100。 |
| acceptorThreadCount | The number of threads to be used to accept connections. Increase this value on a multi CPU machine, although you would never really need more than?2. Also, with a lot of non keep alive connections, you might want to increase this value as well. Default value is?1. 用于接受連接的線程的數(shù)量。在一個多CPU的機器上,增加該值,雖然你可能不會真正需要超過2個。此外,有很多非保持活動連接,您可能需要增加這個值。默認(rèn)值是 1。 |
| acceptorThreadPriority | The priority of the acceptor threads. The threads used to accept new connections. The default value is?5?(the value of the?java.lang.Thread.NORM_PRIORITY?constant). See the JavaDoc for the?java.lang.Thread?class for more details on what this priority means. 接收器線程的優(yōu)先級。該線程用來接受新的連接。默認(rèn)值是5(java.lang.Thread.NORM_PRIORITY常量)。更多這個優(yōu)先級是什么意思的詳細(xì)信息,請查看java.lang.Thread的類的JavaDoc 。 |
| address | For servers with more than one IP address, this attribute specifies which address will be used for listening on the specified port. By default, this port will be used on all IP addresses associated with the server. 對于擁有多個IP地址的服務(wù)器,該屬性指定哪個地址將被用于在指定端口上監(jiān)聽。默認(rèn)情況下,該端口將被用于與服務(wù)器相關(guān)聯(lián)的所有IP地址。 |
| bindOnInit | Controls when the socket used by the connector is bound. By default it is bound when the connector is initiated and unbound when the connector is destroyed. If set to?false, the socket will be bound when the connector is started and unbound when it is stopped. 控制連接器綁定時套接字的使用。缺省情況,當(dāng)連接器被啟動時套接字被綁定和當(dāng)連接器被銷毀時套接字解除綁定。如果設(shè)置為false,連接器啟動時套接字被綁定,連接器停止時套接字解除綁定。 |
| compressableMimeType | The value is a comma separated list of MIME types for which HTTP compression may be used. The default value is?text/html,text/xml,text/plain. 該值是一個被用于HTTP壓縮的逗號分隔的MIME類型列表。默認(rèn)值是text / html類型,為text / xml,text / plain。 |
| compression | The?Connector?may use HTTP/1.1 GZIP compression in an attempt to save server bandwidth. The acceptable values for the parameter is "off" (disable compression), "on" (allow compression, which causes text data to be compressed), "force" (forces compression in all cases), or a numerical integer value (which is equivalent to "on", but specifies the minimum amount of data before the output is compressed). If the content-length is not known and compression is set to "on" or more aggressive, the output will also be compressed. If not specified, this attribute is set to "off". Note: There is a tradeoff between using compression (saving your bandwidth) and using the sendfile feature (saving your CPU cycles). If the connector supports the sendfile feature, e.g. the NIO connector, using sendfile will take precedence over compression. The symptoms will be that static files greater that 48 Kb will be sent uncompressed. You can turn off sendfile by setting?useSendfile?attribute of the connector, as documented below, or change the sendfile usage threshold in the configuration of the?DefaultServlet?in the defaultconf/web.xml?or in the?web.xml?of your web application. ?通常會在ngnix里面配置壓縮 開啟壓縮GZIP? js 為了節(jié)省服務(wù)器帶寬,連接器可以使用HTTP/1.1 GZIP壓縮。可接受的參數(shù)的值是“off ”(禁用壓縮),“on ”(允許壓縮,這會導(dǎo)致文本數(shù)據(jù)被壓縮),“force ”(強制在所有的情況下壓縮),或者一個整數(shù)值(這是相當(dāng)于為“on”,但指定了輸出之前被壓縮的數(shù)據(jù)最小量)。如果不知道內(nèi)容長度但被設(shè)置為“on”或更積極的壓縮,輸出的數(shù)據(jù)也將被壓縮。如果沒有指定,該屬性被設(shè)置為“關(guān)”。 注意:這是使用壓縮(節(jié)省您的帶寬)和使用sendfile功能(節(jié)省你的CPU周期)之間的權(quán)衡。如果連接器支持sendfile功能,例如NIO連接,則使用sendfile將優(yōu)先于壓縮。癥狀是48 KB的靜態(tài)文件將未壓縮就發(fā)送。你可以如下文所述通過設(shè)置連接器的useSendfile屬性來關(guān)閉sendfile,或在默認(rèn)的conf/web.xml或者你的web應(yīng)用的web.xml中配置DefaultServlet來改變sendfile的使用量閾值。 |
| compressionMinSize | If?compression?is set to "on" then this attribute may be used to specify the minimum amount of data before the output is compressed. If not specified, this attribute is defaults to "2048". 如果壓縮被設(shè)置為“on”,那么該屬性可以用于指定在輸出之前被壓縮的數(shù)據(jù)的最小量。如果未指定,此屬性默認(rèn)為“2048”。 |
| connectionLinger | The number of seconds during which the sockets used by this?Connector?will linger when they are closed. The default value is?-1?which disables socket linger. 連接器的套接字被關(guān)閉時的逗留秒數(shù)。如果沒有指定,將使用默認(rèn)的JVM。 |
| connectionTimeout | The number of milliseconds this?Connector?will wait, after accepting a connection, for the request URI line to be presented. Use a value of -1 to indicate no (i.e. infinite) timeout. The default value is 60000 (i.e. 60 seconds) but note that the standard server.xml that ships with Tomcat sets this to 20000 (i.e. 20 seconds). UnlessdisableUploadTimeout?is set to?false, this timeout will also be used when reading the request body (if any). 在將提交的請求URI行呈現(xiàn)之后,連接器將等待接受連接的毫秒數(shù)。使用值-1表示沒有超時(即無限)。默認(rèn)值是60000(60秒),但請注意,Tomcat的標(biāo)準(zhǔn)server.xml中,設(shè)置為20000(即20秒)。 |
| connectionUploadTimeout | Specifies the timeout, in milliseconds, to use while a data upload is in progress. This only takes effect if?disableUploadTimeout?is set to?false. 上傳數(shù)據(jù)過程中,指定的以毫秒為單位超時時間。只有在設(shè)置disableUploadTimeout為false有效。 |
| disableUploadTimeout | This flag allows the servlet container to use a different, usually longer connection timeout during data upload. If not specified, this attribute is set to?true?which disables this longer timeout. 此標(biāo)志允許servlet容器在數(shù)據(jù)上傳時使用不同的連接超時,通常較長。如果沒有指定,該屬性被設(shè)置為true,禁用上傳超時。 |
| executor | A reference to the name in an?Executor?element. If this attribute is set, and the named executor exists, the connector will use the executor, and all the other thread attributes will be ignored. Note that if a shared executor is not specified for a connector then the connector will use a private, internal executor to provide the thread pool. 指向Executor元素的引用。如果這個屬性被設(shè)置,并且被命名的executor存在,連接器將使用這個executor,而其他所有線程相關(guān)屬性將被忽略。請注意共享的executor如果沒有指定到一個連接器,則該連接器將使用一個私有的,內(nèi)部的executor來提供線程池。 |
| executorTerminationTimeoutMillis | The time that the private internal executor will wait for request processing threads to terminate before continuing with the process of stopping the connector. If not set, the default is?0?(zero) for the BIO connector and?5000?(5 seconds) for the NIO and APR/native connectors. |
| keepAliveTimeout | The number of milliseconds this?Connector?will wait for another HTTP request before closing the connection. The default value is to use the value that has been set for theconnectionTimeout?attribute. Use a value of -1 to indicate no (i.e. infinite) timeout. 此連接器在關(guān)閉連接之前將等待另一個HTTP請求的毫秒數(shù)。默認(rèn)值是使用已設(shè)置的connectionTimeout屬性的值。使用值-1表示沒有超時(即無限)。 |
| maxConnections | The maximum number of connections that the server will accept and process at any given time. When this number has been reached, the server will accept, but not process, one further connection. This additional connection be blocked until the number of connections being processed falls below?maxConnections?at which point the server will start accepting and processing new connections again. Note that once the limit has been reached, the operating system may still accept connections based on the?acceptCount?setting. The default value varies by connector type. For BIO the default is the value of?maxThreads?unless anExecutor?is used in which case the default will be the value of maxThreads from the executor. For NIO the default is?10000. For APR/native, the default is?8192. Note that for APR/native on Windows, the configured value will be reduced to the highest multiple of 1024 that is less than or equal to maxConnections. This is done for performance reasons. 在任何給定的時間服務(wù)器接受并處理的最大連接數(shù)。當(dāng)這個數(shù)字已經(jīng)達(dá)到了,服務(wù)器將不會接受任何連接,直到連接的數(shù)量降到低于此值。基于acceptCount的設(shè)置,操作系統(tǒng)可能仍然接受連接。默認(rèn)值根據(jù)不同的連接器類型而不同。對于BIO,默認(rèn)的是maxThreads的值,除非使用了Executor,在這種情況下默認(rèn)值是executor的maxThreads值 。對于NIO的默認(rèn)值是10000。APR /native的默認(rèn)值是8192。 需要注意的是Windows系統(tǒng)的APR/native,所配置的值將減少到小于或等于maxConnections的1024的倍數(shù)的最大值。這樣做是出于性能方面的考慮。 如果設(shè)置的值-1,maxConnections功能被禁用,而且連接數(shù)將不做計算。 |
| maxExtensionSize | Limits the total length of chunk extensions in chunked HTTP requests. If the value is?-1, no limit will be imposed. If not specified, the default value of?8192?will be used. |
| maxHttpHeaderSize | The maximum size of the request and response HTTP header, specified in bytes. If not specified, this attribute is set to 8192 (8 KB). 請求和響應(yīng)的HTTP頭的(以字節(jié)為單位的)最大尺寸。如果沒有指定,該屬性被設(shè)置為8192(8 KB)。 |
| maxKeepAliveRequests | The maximum number of HTTP requests which can be pipelined until the connection is closed by the server. Setting this attribute to 1 will disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 will allow an unlimited amount of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100. HTTP請求最大長連接個數(shù)。將此屬性設(shè)置為1,將禁用HTTP/1.0、以及HTTP/1.1的長連接。設(shè)置為-1,不禁用。如果沒有指定,該屬性被設(shè)置為100。 |
| maxSwallowSize | The maximum number of request body bytes (excluding transfer encoding overhead) that will be swallowed by Tomcat for an aborted upload. An aborted upload is when Tomcat knows that the request body is going to be ignored but the client still sends it. If Tomcat does not swallow the body the client is unlikely to see the response. If not specified the default of 2097152 (2 megabytes) will be used. A value of less than zero indicates that no limit should be enforced. |
| maxThreads | The maximum number of request processing threads to be created by this?Connector, which therefore determines the maximum number of simultaneous requests that can be handled. If not specified, this attribute is set to 200. If an executor is associated with this connector, this attribute is ignored as the connector will execute tasks using the executor rather than an internal thread pool. 最多同時處理的連接數(shù),Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創(chuàng)建的最大的線程數(shù)。如果沒有指定,該屬性被設(shè)置為200。如果使用了execute將忽略此連接器的該屬性,連接器將使用execute,而不是一個內(nèi)部線程池來處理請求。 |
| maxTrailerSize | Limits the total length of trailing headers in the last chunk of a chunked HTTP request. If the value is?-1, no limit will be imposed. If not specified, the default value of?8192will be used. 限制一個分塊的HTTP請求中的最后一個塊的尾隨標(biāo)頭的總長度。如果該值是-1,沒有限制的被強加。如果沒有指定,默認(rèn)值是8192。 |
| minSpareThreads | The minimum number of threads always kept running. If not specified, the default of?10?is used. 始終保持運行最小線程數(shù)。如果沒有指定,則默認(rèn)為10。 |
| noCompressionUserAgents | The value is a regular expression (using?java.util.regex) matching the?user-agent?header of HTTP clients for which compression should not be used, because these clients, although they do advertise support for the feature, have a broken implementation. The default value is an empty String (regexp matching disabled). 該值是一個正則表達(dá)式(使用java.util.regex),匹配不應(yīng)該使用壓縮的HTTP客戶端的用戶代理標(biāo)頭。因為這些客戶端,雖然他們宣稱支持壓縮功能,但實現(xiàn)不完整。默認(rèn)值是一個空字符串(正則表達(dá)式匹配禁用)。 |
| processorCache | The protocol handler caches Processor objects to speed up performance. This setting dictates how many of these objects get cached.?-1?means unlimited, default is?200. If not using Servlet 3.0 asynchronous processing, a good default is to use the same as the maxThreads setting. If using Servlet 3.0 asynchronous processing, a good default is to use the larger of maxThreads and the maximum number of expected concurrent requests (synchronous and asynchronous). 協(xié)議處理器緩存Processor對象以提高性能。此設(shè)置規(guī)定了這些對象有多少能得到緩存。-1意味著無限制,默認(rèn)為200。如果不使用Servlet 3.0的異步處理,一個好的默認(rèn)是使用maxThreads設(shè)置。如果使用Servlet 3.0的異步處理,一個好的默認(rèn)是使用maxThreads和最大預(yù)期的并發(fā)請求(同步和異步)的最大值中的較大值。 |
| restrictedUserAgents | The value is a regular expression (using?java.util.regex) matching the?user-agent?header of HTTP clients for which HTTP/1.1 or HTTP/1.0 keep alive should not be used, even if the clients advertise support for these features. The default value is an empty String (regexp matching disabled). 該值是一個正則表達(dá)式(使用java.util.regex),匹配用戶代理頭的HTTP瀏覽器將不能使用HTTP/1.1或HTTP/1.0長連接,即使該瀏覽器宣稱支持這些功能的。默認(rèn)值是一個空字符串(正則表達(dá)式匹配禁用)。 |
| server | Overrides the Server header for the http response. If set, the value for this attribute overrides the Tomcat default and any Server header set by a web application. If not set, any value specified by the application is used. If the application does not specify a value then?Apache-Coyote/1.1?is used. Unless you are paranoid, you won't need this feature. 覆蓋服務(wù)器的HTTP響應(yīng)頭。如果設(shè)置了這個屬性的值將覆蓋Web應(yīng)用程序設(shè)置的Tomcat的默認(rèn)頭和任何服務(wù)器頭。如果沒有設(shè)置,應(yīng)用程序指定的任何值將被使用。如果應(yīng)用程序沒有指定一個值,那么Apache-Coyote/1.1將被使用。除非你是偏執(zhí)狂,你將不再需要此功能。 |
| socketBuffer | The size (in bytes) of the buffer to be provided for socket output buffering. -1 can be specified to disable the use of a buffer. By default, a buffers of 9000 bytes will be used. 為套接字輸出緩沖而提供的緩沖區(qū)的大小(以字節(jié)為單位)。-1可以被指定來禁止使用的緩沖區(qū)。默認(rèn)情況下,一個9000個字節(jié)的緩沖區(qū)將被使用。 |
| SSLEnabled | Use this attribute to enable SSL traffic on a connector. To turn on SSL handshake/encryption/decryption on a connector set this value to?true. The default value is?false. When turning this value?true?you will want to set the?scheme?and the?secureattributes as well to pass the correct?request.getScheme()?and?request.isSecure()?values to the servlets See?SSL Support?for more information. 在連接器上使用此屬性來啟用SSL加密傳輸。如果要打開SSL握手/加密/解密,請設(shè)置true。默認(rèn)值是false。當(dāng)設(shè)置這個值為true時,為了傳遞正確的request.getScheme()和 request.isSecure()到servlets,你需要設(shè)置scheme和secure屬性。更多信息請查看SSL支持。 |
| tcpNoDelay | If set to?true, the TCP_NO_DELAY option will be set on the server socket, which improves performance under most circumstances. This is set to?true?by default. 如果設(shè)置為true,TCP_NO_DELAY選項將被設(shè)置在服務(wù)器上的套接字上,在大多數(shù)情況下,這樣可以提高性能。默認(rèn)設(shè)置為true。 |
| threadPriority | The priority of the request processing threads within the JVM. The default value is?5(the value of the?java.lang.Thread.NORM_PRIORITY?constant). See the JavaDoc for thejava.lang.Thread?class for more details on what this priority means. 在JVM中請求處理線程的優(yōu)先級。默認(rèn)值是5(java.lang.Thread.NORM_PRIORITY常量值)。關(guān)于優(yōu)先級的更多詳細(xì)信息,請查看java.lang.Thread的類的JavaDoc 。 |
| upgradeAsyncWriteBufferSize | The default size of the buffer to allocate to for asynchronous writes that can not be completed in a single operation. Data that can't be written immediately will be stored in this buffer until it can be written. If more data needs to be stored than space is available in the buffer than the size of the buffer will be increased for the duration of the write. If not specified the default value of 8192 will be used. |
?
3.4.3.???NIO的具體配置
| Attribute | Description |
| pollerThreadCount | (int)The number of threads to be used to run for the polling events. Default value is?1?per processor up to and including version 7.0.27. Default value as of version 7.0.28 is?1?per processor but not more than 2. (int)用來處理輪詢事件的線程的數(shù)量。在版本7.0.27及以前版本,默認(rèn)值是每個處理器1個。版本7.0.28的默認(rèn)值是每個處理器1個,但不超過2個。 當(dāng)接受一個套接字,操作系統(tǒng)擁有全局的鎖。所以超過2個線程的好處而迅速減小。有一個以上的線程是因為系統(tǒng)需要非常迅速地接受連接。但通常只要增加acceptCount值就可以解決這個問題。增加該值也可能是有用的,當(dāng)大量發(fā)送文件操作發(fā)生的時候。 |
| pollerThreadPriority | (int)The priority of the poller threads. The default value is?5?(the value of thejava.lang.Thread.NORM_PRIORITY?constant). See the JavaDoc for the?java.lang.Thread?class for more details on what this priority means. (int)輪詢線程的優(yōu)先級。默認(rèn)值是5(java.lang.Thread.NORM_PRIORITY常量值)。優(yōu)先級的更多詳細(xì)信息,可以查考java.lang.Thread類的JavaDoc 。 |
| selectorTimeout | (int)The time in milliseconds to timeout on a select() for the poller. This value is important, since connection clean up is done on the same thread, so do not set this value to an extremely high one. The default value is?1000?milliseconds. (int)選擇輪詢器select()的超時時間(以毫秒為單位)。這個值非常重要,因為連接清理工作也是在同一個線程里的,所以不要將此值設(shè)置為一個非常高的。默認(rèn)值是1000毫秒。 |
| useComet | (bool)Whether to allow comet servlets or not. Default value is?true. (bool)是否允許Comet servlet。默認(rèn)值是 true。 |
| useSendfile | (bool)Use this attribute to enable or disable sendfile capability. The default value istrue. (bool)使用此屬性來啟用或禁用sendfile的能力。默認(rèn)值是true。 |
| socket.directBuffer | (bool)Boolean value, whether to use direct ByteBuffers or java mapped ByteBuffers. Default is?false. (bool)選擇使??用直接ByteBuffers或Java映射的ByteBuffers。默認(rèn)是false。 當(dāng)您使用直接ByteBuffers,請確保你分配適當(dāng)?shù)膬?nèi)存量給直接內(nèi)存空間。在Sun的JDK中,配置如-XX:MaxDirectMemorySize = 256M。 |
| socket.appReadBufSize | (int)Each connection that is opened up in Tomcat get associated with a read ByteBuffer. This attribute controls the size of this buffer. By default this read buffer is sized at8192?bytes. For lower concurrency, you can increase this to buffer more data. For an extreme amount of keep alive connections, decrease this number or increase your heap size. (int)在Tomcat中每個連接的開辟連接一個讀ByteBuffer。此屬性控制這個緩沖區(qū)的大小。默認(rèn)情況下,這個讀緩沖區(qū)大小為8192字節(jié)。對于較低的并發(fā),你可以增加這個值以緩沖更多的數(shù)據(jù)。對于長連接數(shù)很多的情況,你需要降低這個數(shù)值或者增加堆大小。 |
| socket.appWriteBufSize | (int)Each connection that is opened up in Tomcat get associated with a write ByteBuffer. This attribute controls the size of this buffer. By default this write buffer is sized at8192?bytes. For low concurrency you can increase this to buffer more response data. For an extreme amount of keep alive connections, decrease this number or increase your heap size. (int)在Tomcat中每個連接的開辟連接一個寫B(tài)yteBuffer。此屬性控制這個緩沖區(qū)的大小。默認(rèn)情況下,這個寫緩沖區(qū)大小為8192字節(jié)。對于較低的并發(fā),你可以增加這個值以緩沖更多的響應(yīng)數(shù)據(jù)。對于長連接數(shù)很多的情況,你需要降低這個數(shù)值或者增加堆大小。 這里的默認(rèn)值是相當(dāng)?shù)偷?#xff0c;如果面對的不是幾萬并發(fā)連接,你應(yīng)該增大該值。 |
| socket.bufferPool | (int)The NIO connector uses a class called NioChannel that holds elements linked to a socket. To reduce garbage collection, the NIO connector caches these channel objects. This value specifies the size of this cache. The default value is?500, and represents that the cache will hold 500 NioChannel objects. Other values are?-1?for unlimited cache and?0?for no cache. (int)NIO連接器使用NioChannel這個類來持有鏈接到一個套接字的元素。為了減少垃圾收集,NIO連接器緩存這些通道的對象。此值指定這個緩存的大小。默認(rèn)值是500,表示緩存將持有500個 NioChannel的對象。-1表示不限制緩存大小,0表示不緩存。 |
| socket.bufferPoolSize | (int)The NioChannel pool can also be size based, not used object based. The size is calculated as follows: (int)NioChannel池,也可以是基于尺寸大小,而不是基于對象數(shù)的。該大小的計算如下: NioChannel的緩沖區(qū)大小=讀取緩沖區(qū)大小+寫入緩沖區(qū)大小 SecureNioChannel的緩沖區(qū)大小=應(yīng)用程序讀取緩沖區(qū)大小+應(yīng)用程序?qū)懭刖彌_區(qū)的大小+網(wǎng)絡(luò)讀取緩沖區(qū)大小+網(wǎng)絡(luò)寫入緩沖區(qū)的大小 值(以字節(jié)為單位),默認(rèn)值1024 * 1024 * 100 (100MB)。 |
| socket.processorCache | (int)Tomcat will cache SocketProcessor objects to reduce garbage collection. The integer value specifies how many objects to keep in the cache at most. The default is?500. Other values are?-1?for unlimited cache and?0?for no cache. (int)以減少垃圾收集,Tomcat緩存SocketProcessor對象。該值指定保持在緩存中最多有多少個對象。默認(rèn)值是500。-1表示不限制緩存大小,0表示不緩存。 |
| socket.keyCache | (int)Tomcat will cache KeyAttachment objects to reduce garbage collection. The integer value specifies how many objects to keep in the cache at most. The default is?500. Other values are?-1?for unlimited cache and?0?for no cache. (int)以減少垃圾收集,Tomcat緩存KeyAttachment對象。該值指定保持在緩存中最多有多少個對象。默認(rèn)值是500。-1表示不限制緩存大小,0表示不緩存。 |
| socket.eventCache | (int)Tomcat will cache PollerEvent objects to reduce garbage collection. The integer value specifies how many objects to keep in the cache at most. The default is?500. Other values are?-1?for unlimited cache and?0?for no cache. (int)以減少垃圾收集,Tomcat緩存PollerEvent對象。該值指定保持在緩存中最多有多少個對象。默認(rèn)值是500。-1表示不限制緩存大小,0表示不緩存。 |
| selectorPool.maxSelectors | (int)The max selectors to be used in the pool, to reduce selector contention. Use this option when the command line?org.apache.tomcat.util.net.NioSelectorShared?value is set to false. Default value is?200. (int)以減少選擇器的爭用,在池中使用的選擇器最大個數(shù)。命令行org.apache.tomcat.util.net.NioSelectorShared值設(shè)置為false時,使用此選項。默認(rèn)值是200。 |
| selectorPool.maxSpareSelectors | (int)The max spare selectors to be used in the pool, to reduce selector contention. When a selector is returned to the pool, the system can decide to keep it or let it be GC'd. Use this option when the command line?org.apache.tomcat.util.net.NioSelectorShared?value is set to false. Default value is?-1?(unlimited). (int)以減少選擇器的爭用,在池中使用的最大備用選擇器個數(shù)。當(dāng)選擇器返回到池中時,系統(tǒng)可以決定保留它或者讓他垃圾回收。當(dāng)org.apache.tomcat.util.net.NioSelectorShared 值設(shè)置為false時,使用此選項。默認(rèn)值是-1(無限制)。 |
| command-line-options | The following command line options are available for the NIO connector: 下面的命令行選項可用于NIO連接器:-Dorg.apache.tomcat.util.net.NioSelectorShared=true|false ?默認(rèn)情況下是true。如果你想每個線程使用一個選擇器,將此值設(shè)置為false。當(dāng)你將它設(shè)置為false,你可以通過使用selectorPool.maxSelectors屬性控制選擇器池的大小。 |
| oomParachute | (int)The NIO connector implements an OutOfMemoryError strategy called parachute. It holds a chunk of data as a byte array. In case of an OOM, this chunk of data is released and the error is reported. This will give the VM enough room to clean up. The?oomParachute?represents the size in bytes of the parachute(the byte array). The default value is?1024*1024(1MB). Please note, this only works for OOM errors regarding the Java Heap space, and there is absolutely no guarantee that you will be able to recover at all. If you have an OOM outside of the Java Heap, then this parachute trick will not help. (int)NIO連接器實現(xiàn)了一個名叫parachute的OutOfMemoryError錯誤的策略。它擁有一個塊的數(shù)據(jù)作為一個字節(jié)數(shù)組。在一個OOM的情況下,這個數(shù)據(jù)塊被釋放,并報告錯誤。這會給VM足夠的空間來清理。oomParachute代表parachute(字節(jié)數(shù)組)的大小(以字節(jié)為單位)。默認(rèn)值是 1024 * 1024(1MB)。請注意,這僅適用于關(guān)于Java堆空間的OOM錯誤,也不是絕對保證,你將能夠恢復(fù)所有。如果你有一個Java堆之外OOM的,那么這個parachute也無濟于事。 |
3.4.4.??最佳實踐
?
4.??禁用AJP連接器
AJP(Apache JServerProtocol)
AJPv13協(xié)議是面向包的。WEB服務(wù)器和Servlet容器通過TCP連接來交互;為了節(jié)省SOCKET創(chuàng)建的昂貴代價,WEB服務(wù)器會嘗試維護(hù)一個永久TCP連接到servlet容器,并且在多個請求和響應(yīng)周期過程會重用連接。
?
?
我們一般是使用Nginx+tomcat的架構(gòu),所以用不著AJP協(xié)議,所以把AJP連接器禁用。
?
?
在管理界面中看不到ajp了:
?
?
5.??JVM參數(shù)的優(yōu)化
因為Tomcat運行在JAVA虛擬機之上啊
適當(dāng)調(diào)整Tomcat的運行JVM參數(shù)可以提升整體性能。
5.1. JVM內(nèi)存模型
5.1.1.??Java棧
Java棧是與每一個線程關(guān)聯(lián)的,JVM在創(chuàng)建每一個線程的時候,會分配一定的棧空間給線程。它主要用來存儲線程執(zhí)行過程中的局部變量,方法的返回值,以及方法調(diào)用上下文。棧空間隨著線程的終止而釋放。
5.1.2.??Java堆
Java中堆是由所有的線程共享的一塊內(nèi)存區(qū)域,堆用來保存各種JAVA對象,比如數(shù)組,線程對象等。
5.1.3.??Java堆的分區(qū)
JVM堆一般又可以分為以下三部分:
?
?
◆ Young 年輕區(qū)(代)
?
Young區(qū)被劃分為三部分,Eden區(qū)和兩個大小嚴(yán)格相同的Survivor區(qū),其中,Survivor區(qū)間中,某一時刻只有其中一個是被使用的,另外一個留做垃圾收集時復(fù)制對象用,在Eden區(qū)間變滿的時候, GC就會將存活的對象移到空閑的Survivor區(qū)間中,根據(jù)JVM的策略,在經(jīng)過幾次垃圾收集后,任然存活于Survivor的對象將被移動到Tenured區(qū)間。
?
◆ Tenured 年老區(qū)
?
Tenured區(qū)主要保存生命周期長的對象,一般是一些老的對象,當(dāng)一些對象在Young復(fù)制轉(zhuǎn)移一定的次數(shù)以后,對象就會被轉(zhuǎn)移到Tenured區(qū),一般如果系統(tǒng)中用了application級別(spring容器放在application)的緩存,緩存中的對象往往會被轉(zhuǎn)移到這一區(qū)間。
?
◆ Perm 永久區(qū)
Perm代主要保存class,method,filed對象,這個區(qū)域不會被gc回收。這部份的空間一般不會溢出,除非一次性加載了很多的類,不過在涉及到熱部署的應(yīng)用服務(wù)器的時候,有時候會遇到j(luò)ava.lang.OutOfMemoryError : PermGen space 的錯誤,造成這個錯誤的很大原因就有可能是每次都重新部署,但是重新部署后,類的class沒有被卸載掉,這樣就造成了大量的class對象保存在了perm中,這種情況下,一般重新啟動應(yīng)用服務(wù)器可以解決問題。
?tomcat熱部署:是指在你修改項目BUG的時候?qū)SP或JAVA類進(jìn)行了修改在不重啟WEB服務(wù)器前提下能讓修改生效。但是對配置文件的修改除外!?
?
Virtual區(qū):虛擬區(qū)
最大內(nèi)存和初始內(nèi)存的差值,就是Virtual區(qū)。
5.1.4.??設(shè)置區(qū)大小
JVM提供了相應(yīng)的參數(shù)來對內(nèi)存大小進(jìn)行配置。正如上面描述,JVM中堆被分為了3個大的區(qū)間,同時JVM也提供了一些選項對Young,Tenured的大小進(jìn)行控制。
如何設(shè)置年輕代大小?哪些應(yīng)用系統(tǒng)需要調(diào)整年輕代老年代? 永久代?
?這個需要根據(jù)應(yīng)用場景的特點設(shè)置啊,如果說我們需要經(jīng)常創(chuàng)建對象啊? 而且對象使用完后馬上會被回收的,這種場景年輕代可以適當(dāng)調(diào)大。
? 比如說:對外提供一個查詢數(shù)據(jù)的接口,返回數(shù)據(jù)? 查詢出來的對象轉(zhuǎn)換成json對象? 然后這個接口頻繁訪問? 的我們可以適當(dāng)調(diào)大一點。
?老年代:? 靜態(tài)變量什么的
?
?
◆ Total Heap
?
-Xms :指定了JVM初始啟動以后初始化內(nèi)存
?
-Xmx:指定JVM堆得最大內(nèi)存,在JVM啟動以后,會分配-Xmx參數(shù)指定大小的內(nèi)存給JVM,但是不一定全部使用,JVM會根據(jù)-Xms參數(shù)來調(diào)節(jié)真正用于JVM的內(nèi)存
?
-Xmx -Xms之差就是三個Virtual空間的大小
?
◆ Young Generation
?
-XX:NewRatio=8意味著tenured 和 young的比值8:1,這樣eden+2*survivor=1/9
?
堆內(nèi)存
?
-XX:SurvivorRatio=32意味著eden和一個survivor的比值是32:1,這樣一個Survivor就占Young區(qū)的1/34.
?
-Xmn 參數(shù)設(shè)置了年輕代的大小
?
◆ Perm Generation
?
-XX:PermSize=16M -XX:MaxPermSize=64M
?
Thread Stack
?
-XX:Xss=128K
?
5.2. 常用參數(shù)
?
修改文件:bin/catalina.sh
?
JAVA_OPTS="-Dfile.encoding=UTF-8-server –Xms512m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=256m-XX:MaxPermSize=256m -XX:NewRatio=2 -XX:MaxTenuringThreshold=50-XX:+DisableExplicitGC"
?
參數(shù)說明:
1、? file.encoding 默認(rèn)文件編碼
2、? -Xmx1024m? 設(shè)置JVM最大可用內(nèi)存為1024MB
3、? -Xms1024m? 設(shè)置JVM最小內(nèi)存為1024m。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
4、? -XX:NewSize? 設(shè)置年輕代大小
5、? XX:MaxNewSize 設(shè)置最大的年輕代大小
6、? -XX:PermSize? 設(shè)置永久代大小
7、? -XX:MaxPermSize 設(shè)置最大永久代大小
8、? -XX:NewRatio=4:設(shè)置年輕代(包括Eden和兩個Survivor區(qū))與終身代的比值(除去永久代)。設(shè)置為4,則年輕代與終身代所占比值為1:4,年輕代占整個堆棧的1/5
9、? -XX:MaxTenuringThreshold=0:設(shè)置垃圾最大年齡,默認(rèn)為:15。如果設(shè)置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進(jìn)入年老代。對于年老代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一個較大值,則年輕代對象會在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
10、?????????????-XX:+DisableExplicitGC這個將會忽略手動調(diào)用GC的代碼使得System.gc()的調(diào)用就會變成一個空調(diào)用,完全不會觸發(fā)任何GC
5.3. 在tomcat中設(shè)置JVM參數(shù)
5.3.1.??windows
修改bin/catalina.bat文件設(shè)置參數(shù)(第一行 93行)
set JAVA_OPTS=-Dfile.encoding=UTF-8 -server-Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m-XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2-XX:+DisableExplicitGC
?
5.3.2.??linux
修改bin/catalina.sh文件參數(shù)(第一行)
JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m-XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC"
?
總結(jié)
以上是生活随笔為你收集整理的tomcat7 性能优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分查找思想以及模版的套用
- 下一篇: 【解决】Outlook无法正常显示邮件中