當前位置:首頁 » 文件管理 » gzip壓縮tomcat

gzip壓縮tomcat

發布時間: 2023-01-27 13:19:52

A. tomcat的網站如何啟用gzip

假設你安裝了google瀏覽器,打開一個頁簽,按f12,輸入一個url,然後選擇network標簽, 刷新網頁(在打開調試工具的情況下刷新);
接著.刷新後在左邊找到該網頁url,點擊 後右邊選擇headers,就可以看到當前網頁的http頭了。如果在Request Headers下面的Accept-Encoding:包含gzip,說明已經成功使用gzip壓縮解壓請求內容了

B. 如何開啟Tomcat伺服器的Gzip網頁壓縮功能

現在主流的瀏覽器如谷歌瀏覽器和IE瀏覽器都支持客戶端Gzip,也就是說,在伺服器上的網頁,傳輸之前,先使用Gzip壓縮再傳輸給客戶端,客戶端接收之後由瀏覽器解壓顯示,這樣雖然稍微佔用了一些伺服器和客戶端的CPU,但是換來的是更高的帶寬利用率

C. 如何利用gzip壓縮網頁來提升網站瀏覽速度

純Tomcat 伺服器
如果您的 WEB 應用程序是跑在 Tomcat
伺服器下的,而且直接使用 Tomcat 所提供的 HTTP 服務,那建議你馬上動手,因為實在是太簡單了,你只需要在 server.xml
配置文件中給 HTTP Connector 增加一個 compression 的參數值為 on 並重啟 Tomcat
伺服器就立刻生效,配置如下:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" compression="on"/>
Tomcat
採用的是 HTTP/1.1 的 GZIP 壓縮協議,它會根據瀏覽器送過來的請求中的 accept-encoding 值是否包含 gzip
來判斷瀏覽器是否支持 gzip 壓縮協議,如果瀏覽器支持就啟用 gzip 壓縮,否則就不進行任何壓縮處理。Tomcat 中還有另外一個參數
compressableMimeType,這個參數可以用來指定壓縮哪種類型的內容,例如可以指定該配置值為:text/html,text
/plain ,則只壓縮 contentType 為 text/html 和 text/plain 的頁面,不過您最好也將 css 和
javascript 文件也算在壓縮的文件類型中,因為這兩者的壓縮效果也十分的明顯。
Apache 伺服器

apache 1.3 版本,大家常用 mod_gzip 對輸出內容進行壓縮,現在主流的瀏覽器都支持 gzip 解壓縮。在 apache2
下,這個模塊換名為 mod_deflate,對應的模塊文件名是 mod_deflate.so。mod_gzip 本文不做介紹,下面描述一下在
Apache 2 下如何啟用並配置 mod_deflate 模塊。默認安裝的 Apache 不管是 Windows 還是
Linux/Unix,都是不啟用該模塊的, Linux/Unix 下甚至不帶該模塊,你需要手工編譯這個模塊。
下面我們分別介紹在 Windows 和 Linux 操作系統下如何啟用並配置 mod_deflate 模塊。
在 Windows 下採用安裝程序安裝的 Apache 伺服器已經帶有 deflate 所需要的模塊 mod_deflate.so 和 mod_headers.so,我們只需要在 httpd.conf 配置文件中啟用並進行相關的配置即可,配置如下:
LoadMole deflate_mole moles/mod_deflate.so
LoadMole headers_mole moles/mod_headers.so
<Location />
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>

如果是 Linux/Unix 操作系統,如果你沒有在編譯安裝的過程中將所需要的兩個模塊 mod_deflate 和 mod_headers
編譯進去的話,那就稍微有點麻煩,首先我們先看如何在編譯安裝 Apache 過程中也同時編譯這兩個模塊,請在執行 configure
程序時增加兩個參數分別是:
# ./configure --enable-deflate --enable-headers
這樣在編譯完 Apache 後就可以直接在 httpd.conf 中啟用並配置 deflate 模塊了,配置的方法跟 Windows 平台下是相同的。

果說您的 Apache 已經在運行了,不想再重新編譯一次,那也可以選擇只編譯 deflate 模塊所需的文件 mod_deflate.c
和mod_headers.c。這兩個文件位於 {apache-src}/moles/filters/ 目錄下(其中 {apache-src}
為 apache 源文件所在的目錄)。使用如下命令來單獨編譯這兩個源文件。
# {apache-bin}/apxs -i -a -c {apache-src}/moles/filters/mod_deflate.c
# {apache-bin}/apxs –i –a –c {apache-src}/moles/filters/mod_headers.c
其中 {apache-bin} 為 Apache 安裝目錄下的 bin 目錄,接下來在 httpd.conf 直接配置該模塊即可。
很多時候你在單獨編譯 deflate 模塊的時候可能會碰到編譯錯誤,提示是:
Cannot load /opt/apache/moles/mod_deflate.so into server: /opt/apache/moles/mod_deflate.so: undefined symbol: deflate
解決的方法如下:
編輯 /usr/local/apache2/bin/apr-config 文件修改其中的 LDFLAGS 值為 "-lz",然後再重新編譯 mod_deflate 模塊,apxs -ica mod_deflate.c 即可。
為了省卻不必要的麻煩,請盡量在編譯安裝時直接加上 --enable-deflate --enable-headers 參數。
IIS 伺服器

軟的 IIS 伺服器同樣也是目前用得最多的 WEB 伺服器之一,而且用來運行 ASP 頁面也是必不可少的。IIS6,iis本身支持 gzip
壓縮,IIS5就比較費勁了,你可以找一些第三方的組件來處理,例如 httpzip,接下來我們介紹如何在 IIS6 中啟用壓縮功能。
打開 Internet 信息服務(IIS)管理器,右擊"網站"->"屬性",選擇"服務"。在 "HTTP壓縮" 框中選中 "壓縮應用程序文件" 和 "壓縮靜態文件",按需要設置 "臨時目錄" 和 "臨時目錄的最大限制",
設置網站屬性


下來配置 gzip 組件,在 Internet 信息服務(IIS)管理器,點擊 "Web 服務擴展"->"增加一個新的 Web
服務擴展...",在 "新建 Web 服務擴展" 框中輸入擴展名 "HTTP Compression",添加 "要求的文件" 為
C:\WINDOWS\system32\inetsrv\gzip.dll,選中 "設置擴展狀態為允許",如下圖所示:
設置 Web 服務擴展,新建 Web 服務擴展

還沒完呢,我們還需要修改一個配置文件,修改之前請先停止 IIS 服務,打開 C:\Windows\System32\inetsrv\MetaBase.xml,這個文件很大,找到下面一段信息:
<IIsCompressionScheme Location ="/LM/W3SVC/Filters/Compression/gzip"
HcCompressionDll="%windir%\system32\inetsrv\gzip.dll"
HcCreateFlags="1"
HcDoDynamicCompression="TRUE"
HcDoOnDemandCompression="TRUE"
HcDoStaticCompression="TRUE"
HcDynamicCompressionLevel="0"
HcFileExtensions="htm
html
txt"
HcOnDemandCompLevel="10"
HcPriority="1"
HcScriptFileExtensions="asp
dll
exe"
>
</IIsCompressionScheme>
增加一些要進行壓縮的文件後綴,其中 HcFileExtensions 是靜態文件的擴展名,增加 js 和 css 等;HcScriptFileExtensions 為動態文件的擴展名,增加 aspx,保存後啟動 IIS 即可生效。

後我們介紹如何來測試前面所做的工作是否起效,你可能會覺得很奇怪,配置好了,用瀏覽器打開頁面正常,查看頁面源碼,內容並沒有變化,大小也跟原來一樣,
怎麼回事呢?這是因為瀏覽器已經把內容解壓了的結果,有兩個方法來判斷壓縮是否生效:第一,查看 WEB 伺服器的日誌,不管是 Apache 或者是
IIS,二者的訪問日誌格式都差不多是下面這種格式:
127.0.0.1 - - [14/May/2006:08:44:28 +0800] "GET /manual/style/css/manual.css HTTP/1.1" 200 19351

後兩個數字分別是 HTTP 的結果碼(200 表示 OK),19351
表示的是響應內容的大小,把這個大小跟你在瀏覽器上查看源碼的大小比較一下就可以知道是否生效。另外一種方法就是自己寫一個 HTTP
客戶端的小程序並設置 Accept-Encoding 的值為 gzip,deflate,由這個程序去請求伺服器端的某個 URL
地址,然後列印出響應的內容,如果是一堆亂碼,恭喜你,配置成功。下面是一段 Java 寫的測試客戶端代碼(需要用到
commons-httpclient 包):
HttpClient http = new HttpClient();
String url = http://www.softbar.com;
GetMethod get = new GetMethod(url);
try{
System.out.println("fetching url : "+ url);
get.addRequestHeader("accept-encoding", "gzip,deflate");
int er = http.executeMethod(get);
if(er==200){
System.out.println(get.getResponseContentLength());
String html = get.getResponseBodyAsString();
System.out.println(html);
System.out.println(html.getBytes().length);
}
}finally{
get.releaseConnection();
}
結論

上是目前比較流行的兩個 WEB 伺服器軟體以及 Tomcat 伺服器對於頁面壓縮的配置方法;其他的一些 J2EE
應用伺服器如果不支持這個功能的話可以考慮利用過濾器(Servlet Filter)來進行處理,具體的代碼以及配置方法可以參考 Resin
伺服器所提供的文檔。但是有一點需要提醒各位讀者的是,本文介紹的訪問只是在伺服器本身的響應速度已經足夠優化的情況下進行,也就是說在帶寬成為系統瓶頸
的時候才來考慮該方案。

D. 我用jquery的get()方法訪問百度首頁的時候,默認他使用gzip壓縮,怎麼不讓他使用gzip壓縮

gzip壓縮JavaScript ExtJS JQuery gzip 壓縮JavaScript

為了提高客戶端的體驗效果,RIA開發逐漸興起。這樣會項目中會充斥的大量的JavaScript代碼,與此同時會消耗客戶端瀏覽器性能。對於 Ext 實現的 one page one application ,對於外網訪問也就產生了噩夢似的載入(除非你的網速足夠快)。為了緩解(不是解決,從代碼載入方面考慮)載入慢的問題可以對JavaScript進行壓縮。

JavaScript的gzip靜態壓縮方法

一、將js格式文件壓縮成gzjs格式。使用gzip.exe打包壓縮後的JS文件,最後生成xx.js.gz,把xx.js.gz文件改成xx.gzjs。壓縮實例: ext-all.js (610KB), gzip.exe壓縮後為ext-all.gzjs(168KB)。
附:gzip使用方法,在命令行下輸入: gzip -9 ext-all.js ext-all.js.gz
修改ext-all.js.gz的後綴名ext-all.gzjs(註:也可以通過gzip -h命令查看幫助)
下載地址:http://www.gzip.org

二、在項目web.xml中加入過濾器。
代碼如下:
查看復制到剪貼板列印
<filter>
<filter-name>GzipJsFilter</filter-name>
<filter-class>net.kangsoft.util.GzipJsFilter</filter-class>
<init-param>
<param-name>headers</param-name>
<param-value>Content-Encoding=gzip</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>GzipJsFilter</filter-name>
<url-pattern>*.gzjs</url-pattern>
</filter-mapping>

三、加入過濾類
查看復制到剪貼板列印
package net.kangsoft.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GzipJsFilter
implements Filter
{
Map headers = new HashMap();

public void destroy() { }

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)

throws IOException, ServletException {
if (req instanceof HttpServletRequest)
doFilter((HttpServletRequest)req, (HttpServletResponse)res, chain);
else
chain.doFilter(req, res);
}

public void doFilter(HttpServletRequest request, HttpServletResponse response,

FilterChain chain)
throws IOException, ServletException
{
request.setCharacterEncoding("UTF-8");
for (Iterator it = this.headers.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = (Map.Entry)it.next();
response.addHeader((String)entry.getKey(), (String)entry.getValue());
}
chain.doFilter(request, response);
}

public void init(FilterConfig config) throws ServletException {
String headersStr = config.getInitParameter("headers");
String[] headers = headersStr.split(",");
for (int i = 0; i < headers.length; ++i) {
String[] temp = headers[i].split("=");
this.headers.put(temp[0].trim(), temp[1].trim());
}
}
}

四、在需導入js的頁面head裡面添加導入文件,如:<script type="text/javascript"

src="js/ext3/ext-all.gzjs"></script>

配置Apache,Tomcat的gzip壓縮功能

HTTP 壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求網頁後,從伺服器端將網頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負責解 壓縮並瀏覽。相對於普通的瀏覽過程HTML ,CSS,Javascript , Text ,它可以節省40%左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率驚人

對於Tomcat5.0以後的版本是支持對輸出內容進行壓縮的。使用的是gzip壓縮格式

對於Tomcat5.0以後的版本是支持對輸出內容進行壓縮的. 使用的是gzip壓縮格式
下面是tomcat5.5.20 中的$tomcat_home$/conf/server.xml的原內容

查看復制到剪貼板列印
< Connector port ="80" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" URIEncoding ="utf-8" />
<!-- Note : To disable connection timeouts, set connectionTimeout value to 0 -->

<!-- Note : To use gzip compression you could set the following properties :

compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"
-->
從上面的第8行內容可以看出,要使用gzip壓縮功能,你可以在Connector實例中加上如下 屬性即可
1) compression="on" 打開壓縮功能
2) compressionMinSize="2048" 啟用壓縮的輸出內容大小,這裡面默認為2KB
3) noCompressionUserAgents="gozilla, traviata" 對於以下的瀏覽器,不啟用壓縮
4) compressableMimeType="text/html,text/xml" 壓縮類型

我這里的配置內容為:
查看復制到剪貼板列印
<Connector port="80" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="utf-8"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
<!-- Note : To disable connection timeouts, set connectionTimeout value to 0 -->

<!-- Note : To use gzip compression you could set the following properties :

compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"
-->

tomcat 開啟Gzip :
1.找到Tomcat 目錄下的conf下的server.xml,並找到如下信息
查看復制到剪貼板列印
Connector port="8080"
maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
將它改成如下的形式(其實在上面代碼的下面已經有了,將他們打開而已。)
查看復制到剪貼板列印
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080"
maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"
>
這樣,就能夠對html和xml進行壓縮了,如果要壓縮css 和 js,那麼需要

查看復制到剪貼板列印
<Connector port="8080"
.........
compressableMimeType="text/html,text/xml,text/css,text/javascript"
>
甚至可以壓縮圖片:
查看復制到剪貼板列印
<Connector port="8080"
.........
compressableMimeType="text/html,text/xml,text/css,text/javascript,image/gif,image/jpg"
>

一旦啟用了這個壓縮功能後,我們怎麼來測試壓縮是否有效呢?首先Tomcat是根據瀏覽器請求頭中的accept-encoding來判斷瀏覽器是否支持壓縮功能,如果這個值包含有gzip,就表明瀏覽器支持gzip壓縮內容的瀏覽,所以我們可以用httpclient來寫一個這樣的簡單測試程序.

查看復制到剪貼板列印
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;

public class HttpTester {

public static void main(String[] args) throws Exception{
HttpClient http = new HttpClient();
GetMethod get = new GetMethod("http://www.dlog.cn/js/prototype.js");
try{
get.addRequestHeader("accept-encoding", "gzip,deflate");
get.addRequestHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Alexa Toolbar; Maxthon 2.0)");
int er = http.executeMethod(get);
if(er==200){
System.out.println(get.getResponseContentLength());
String html = get.getResponseBodyAsString();
System.out.println(html);
System.out.println(html.getBytes().length);
}
}finally{
get.releaseConnection();
}
}

}

執行這個測試程序,看看它所輸出的是什麼內容,如果輸出的是一些亂碼,以及列印內容的長度遠小於實際的長度,那麼恭喜你,你的配置生效了,你會發現你網站的瀏覽速度比以前快多了。

對於Apache而言,有兩種情況
1)針對Apache2.0之前的版本,它原本是不支持 的,不過可以通過添加第三方的mole_gzip模塊來啟用
2)針對Apache2.0及之後的版本,Apache提供支持, 不過不叫gzip,而叫mod_deflate
下面就對Apache2.0及之後的版本作一個說明
1) 去掉#LoadMole headers_mole moles/mod_headers.so前面的注釋#,
2) 添加LoadMole deflate_mole moles/mod_deflate.so
3) 在VirtualHost中添加
查看復制到剪貼板列印
<Location "/">
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</Location>
我這裡面有一個完整的演示
查看復制到剪貼板列印
# 載入deflate模塊
LoadMole headers_mole moles/mod_headers.so
LoadMole deflate_mole moles/mod_deflate.so
<VirtualHost *:80>
DocumentRoot f:/apacheTest
<Location "/">
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</Location>
</VirtualHost>

E. 如何驗證Tomcat Gzip配置是否生效的方法

@author YHC
tomcat版本要求:5.0+
step 1:找到你的${tomcat}/conf/server.xml 注:${tomcat}代表你的tomcat安裝路徑
step 2:打開文件,添加以下紅線圈住選項:

以上代碼解釋:

[plain]
compression=on 打開tomcat壓縮功能
compressionMinSize=10 需要壓縮的文件最小大小 單位是KB
noCompressionUserAgents=gozilla, traviata 對於以逗號隔開配置的瀏覽器類型不進行gzip壓縮
compressableMimeType=text/html,text/xml,text/javascript,text/css,text/plain 那些類型是需要壓縮的
compression=on 打開tomcat壓縮功能
compressionMinSize=10 需要壓縮的文件最小大小 單位是KB
noCompressionUserAgents=gozilla, traviata 對於以逗號隔開配置的瀏覽器類型不進行gzip壓縮
compressableMimeType=text/html,text/xml,text/javascript,text/css,text/plain 那些類型是需要壓縮的到此tomcat的配置就算是完成了.以下內容是對gzip過濾器的配置,你可以選擇自己實現,但是在這里我使用的是tk-filers工具,在最下面會提供下載;

F. tomcat 性能調優

java性能優化原則:代碼運算性能 內存回收 應用配置(影響java程序注意原因是垃圾回收)

代碼層優化:避免過多的循環嵌套 調用和復雜邏輯

Tomcat調優主要內容

1.增加最大連接數

2.調整工作模式

3.啟用gzip壓縮

4.調整JVM內存大小

5.作為web伺服器時 與Apache整合或Nginx

6.合理選擇垃圾回收演算法

7.盡量使用較新版的JDK

生產環境實例

<connector p=""

maxThreads="1000"

minSpareThreads="100"

maxSpareThreads="200"

acceptCount="900"

disableUploadTimeout="true"

connectionTimeout="20000"

URIEncoding="UTF-8"

enableLookups="false"

redirectPort="8443"

compression="on"

compressionMinSize="1024"

compressableMimeType="text/html,text/xml,text/css,text/javascript"/>

參數說明:

org.apache.coyote.http11.Http11NioProtocol:調整工作模式為Nio

maxThreads:最大線程數,默認150。增大值避免隊列請求過多,導致響應緩慢。

minSpareThreads:最小空閑線程數

maxSpareThreads:最大空閑線程數,如果超過這個值,會關閉無用的線程。

acceptCount:當處理請求超過此值時,將後來請求放到隊列中等待。

disableUploadTimeout:禁用上傳超時時間

connectionTimeout:連接超時,單位毫秒,0代表不限制

URIEncoding:URI地址編碼使用UTF-8

enableLookups:關閉dns解析,提高響應時間

compression:啟用壓縮功能

compressionMinSize:最小壓縮大小,單位Byte

compressableMimeType:壓縮的文件類型

Tomcat的三種工作模式: Bio、Nio和Apr 工作原理分別為

Bio(Blocking I/O):默認工作模式 阻塞式I/O操作 沒有任何優化技術處理 性能比較低

Nio(New I/O or Non-Blocking):非阻塞式I/O操作 有BIO更好的並發處理性能

Apr(apache portable runtime,apache可移植運行庫):首選工作模式 主要為上層的應用程序提供一個可以跨越多操作系統平台使用的底層支持介面庫

Tomcat利用基於APR庫Tomcat-native來實現操作系統級別控制 提供一種優化技術和非阻塞式I/O操作 大大提高並發處理能力

但是需要安裝APR和Tomcat-native庫

Java性能問題主要來自於jvm jvm GC也比較復雜

1、jvm內存劃分為年輕代(Young Generation)、年老代 Old Generation)、永久代(Permanent Generation)

2、年輕代又分為Eden和Survivor區。Survivor區由FromSpace和ToSpace組成。Eden區佔大容量,Survivor兩個區佔小容量,默認8:2

3、堆內存Heap=年輕代+年老代 非堆內存=永久代

4、堆內存用途:存放的是對象 垃圾收集器就是收集這些對象的 然後根據GC演算法回收

5、非堆內存用途:JVM本身使用 存放一些類型 方法 常量 屬性等

6、年輕代:新生成的對象首選放到年輕代的E區中 當E區滿時 經過GC後 還存活的對象被復制到Survivor區的FromSpace中 如果survivor區滿

會再被復制到survivor區的ToSpace區 如果還有存活的對象 會再被復制到老年代

7、老年代:在年輕代中經過GC後還存活的對象會被復制到老年代中 當老年代空間不足時 jvm會對老年代進行完全的垃圾回收(Full GC)

如果GC後 還是無法存放從survivor區復制過來的對象 就會出現OOM

8、永久代:也稱為方法區 存放靜態類型數據 比如類 方法 屬性等

垃圾回收演算法

1、標記 清除

2、復制

3、標記 整理

垃圾收集器

單線程/多線程收集器

GMS收集器

JAVA_OPTS="-server -Xms1024m -Xmx1536m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParallelGCThreads=8 XX:=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log"

參數 描述

-Xms 堆內存初始大小 單位M、G

-Xmx 堆內存最大允許大小 一般不要大於物理內存的80%

-XX:PermSize 非堆內存初始大小 一般應用設置初始化200M 最大1024M就夠了

-XX:MaxPermSize 非堆內存最大允許值

-XX:+UseParallelGCThreads=8 並行收集器線程數 同時有多少個線程進行垃圾回收 一般與CPU數量相等

-XX:+UseParalle101dGC 指定老年代為並行收集

-XX:+UseConcMarkSweepGC CSM收集器

-XX:+ 開啟內存空間壓縮和整理 防止過多內存碎片

-XX:CMSFullGCsBeforeCompaction=0 表示多少次Full GC後開始壓縮和整理 0表示每次Full GC後立即執行壓縮和整理

-XX:=80% 表示老年代內存空間使用80%時開始執行CMS收集 防止過多的Full GC

注意:不是jvm內存設置越大越好 具體還是根據項目對象實際占內存大小而定 可以通過java自帶的分析工具來查看

如果設置過大 會增加回收實際 從而增加暫停應用時間

gzip壓縮作用:節省伺服器流量和提高網站訪問速度 客戶端請求伺服器資源後 伺服器將資源文件壓縮 再返回給客戶端 有客戶端的瀏覽器負責壓縮並瀏覽

Apache和Tomcat結合

由於Tomcat處理靜態文件能力遠遠不足Apache 所有用Apache處理靜態文件 Tomcat負責處理jsp

session會話的保持

TomcatSessionID持久化三種方法

session粘性:通過瀏覽器cookie綁定sessionID 通過sticky模式將同一session請求分片到同一Tomcat上

session復制:tomcat通過廣播形式將session同步到其它Tomcat節點 並且Linux下要手動開啟開放廣播地址 不宜後端節點過多

session保持資料庫(memcache redis):將sessionID保存在共享的資料庫中

OOM異常的幾個原因

老年代內存不足:java.lang.OutOfMemoryError:Javaheapspace

永久代內存不足:java.lang.OutOfMemoryError:PermGenspace

代碼bug 佔用內存無法及時回收

G. nginx和tomcat同時開啟gzip,會有什麼後果

新部署的一台伺服器在做了性能調優以後發現FCK在線編輯器IE、firefox都出現報錯,只有chrome正常。百思不得其解,差點就把FCK換掉。經過千辛萬苦終於找到了原因(本人找錯誤原因的運氣一直都非常好):

開始以為是腳本亂碼,看了文件頭的那段注釋以後確認不是這個問題。

在firefox的firedebug上面看到的腳本一直報找不到對象的錯誤,難道是公司的網路龜速導致腳本載入順序不協調所致?幾次刷新以後問題還在,304狀態碼說明不是網路龜速的原因。

最後把FCK的javascript腳本下載到本地以後一看,只有20k左右,而完整的是249K,看來我找到原因了~~

還是百思不得其解,好好的靜態腳本文件為什麼會下載了一部分就完了呢?而且首次下載的狀態碼是200,之後的刷新都是304,這違反了我對HTTP狀態碼的理解。

撇開前端的Nginx,直接訪問tomcat居然頁面就正常了。so~問題在nginx。nginx處理靜態資源的能力從來都沒有懷疑過(這再次違反了我對XXX的理解)。

靈光一閃,前後端的伺服器最近都進行了調優,難道是這次修改了配置文件導致的?so首先關閉nginx的gzip off;,重啟Nginx後全世界正常了。隨後關閉後端tomcat的compression="off",重新啟用Nginx的gzip,問題終於解決了。

總結:多層伺服器結構的系統啟用gzip壓縮要注意一個問題:前端伺服器啟用了gzip以後,後端的伺服器就不要啟用gzip壓縮了,不然部分瀏覽器會下載到不完整的文件。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:713
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:977
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:686
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:838
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:745
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1085
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:314
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:194
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:882
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:840