MyEclipse,MySQL调优,JVM调优,Tomcat调优

MyEclipse,MySQL调优,JVM调优,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调优
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调优

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异常

虚拟机栈(线程私有)

每个方法在执行的时候也会创建一个栈帧,存储了局部变量,操作数,动态链接,方法返回地址
每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈
通常所说的栈,一般是指在虚拟机栈中的局部变量部分,局部变量所需内存在编译期间完成分配
如果线程请求的栈深度大于虚拟机所允许的深度,抛出*Error异常
如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存,抛出OutOfMemoryError异常

本地方法栈(线程私有)

和虚拟机栈类似,主要为虚拟机使用到的Native方法服务。也会抛出*Error 和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

<user name="user" password="user" roles="standard,manager"/> 

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 压缩文件类型
上一篇:MyEclipse 如何将 jar 包导入项目中


下一篇:常用Java开发工具