gzip压缩tomcat
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压缩了,不然部分浏览器会下载到不完整的文件。
