className=Horg.apache.coyote.tomcat4.CoyoteConnectorHport=H80HminProcessors="5"maxProcessors="75"enableLookups="false"redirectPort="8443"
acceptCount="100"debug="0"connectionTimeout="20000"useURIValidationHack=HfalseHdisableUploadTimeout=HtrueH/>
Tomcat5
3.调整线程数
通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。
Tomcat使用线程池加速响应速度来处理请求。
在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。
它们共享相同的地址空间。
多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接更多的请求。
Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。
这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。
minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。
也就是说,如果一天内每秒仅发生5次单击事件,并且每个请求任务处理需要1秒钟,那么预先设置线程数为5就足够了。
但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors的值。
maxProcessors的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。
如果要加大并发连接数,应同时加大这两个参数。
webserver允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。
在Tomcat5对这些参数进行了调整,请看下面属性:
maxThreadsTomcat使用线程来处理接收的每个请求。
这个值表示
Tomcat可创建的最大的线程数。
acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
connnectionTimeout网络连接超时,单位:
毫秒。
设置为0表示永不超时,这样设置有隐患的。
通常可设置为30000毫秒。
minSpareThreadsTomcat初始化时创建的线程数。
maxSpareThreads一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。
在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的web站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值。
2、如何加大comcat连接数
在tomcat配置文件server.xml中的〈Connector/〉
配置中,和连接数相关的参数有:
minProcessors:
最小空闲连接线程数,用于提高系统处理性能,默认值为10
maxProcessors:
最大连接线程数,即:
并发处理的最大请求数,默认值为75
acceptCount:
允许的最大连接数,应大于等于maxProcessors,默认值为100
enableLookups:
是否反查域名,取值为:
true或false。
为了提高处理能力,应设置为false
connectionTimeout:
网络连接超时,单位:
毫秒。
设置为0表示永不超时,这样设置有隐患的。
通常可设置为30000毫秒。
其中和最大连接数相关的参数为maxProcessors和acceptCount。
如果要加大并发连接数,应同时加大这两个参数。
webserver允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。
tomcat5中的配置示例:
对于其他端口的侦听配置,以此类推。
3、怎样加大tomcat的内存
首先检查程序有没有限入死循环
这个问题主要还是由这个问题java.lang.OutOfMemoryError:
Javaheapspace
引起的。
第一次出现这样的的问题以后,引发了其他的问题。
在网上一查可能是JAVA的堆栈设置太小的原因。
跟据网上的答案大致有这两种解决方法:
1、设置环境变量
解决方法:
手动设置Heapsize
修改TOMCAT_HOME/bin/catalina.sh
setJAVA_0PTS=-Xms32m-Xmx512m
可以根据自己机器的内存进行更改。
2、java-Xms32m-Xmx800mclassName
就是在执行JAVA类文件时加上这个参数,其中className是需要执行的确类名。
(包括包名)这个解决问题了。
而且执行的速度比没有设置的时候快很多。
如果在测试的时候可能会用Eclispe这时候就需要在Eclipse->run-arguments中的VMarguments中输入-Xms32m-Xmx800m这个参数就可以了。
后来在Eclilpse中修改了启动参数,在VMarguments
加入了-Xms32m-Xmx800m,问题解决。
一、java.lang.OutOfMemoryError:
PermGenspace
PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域,
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很多CLASS的话,
就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候。
如果你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:
手动设置MaxPermSize大小修
改TOMCAT_HOME/bin/catalina.sh
在"echo"UsingCATALINA_BASE:
$CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server-XX:
PermSize=64M-XX:
MaxPermSize=128m建议:
将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar文档重复占用内存的目的。
二、java.lang.OutOfMemoryError:
Javaheapspace
Heapsize设置
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置JVM在启动的时候会自动设置Heapsize的值,
其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。
可以利用JVM提供的-Xmn-Xms-Xmx等选项可进行设置。
Heapsize的大小是YoungGeneration和TenuredGeneraion
之和。
提示:
在JVM中如果98%的时间是用于GC且可用的Heapsize不足2%的时候将抛出此异常信息。
提示:
HeapSize最大不要超过可用物理内存的80%,—般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:
手动设置Heapsize
修改TOMCAT_HOME/bin/catalina.sh
在"echo"UsingCATALINA_BASE:
$CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server-Xms800m-Xmx800m-XX:
MaxNewSize=256m"
三、实例,以下给出1G内存环境下javajvm的参数设置参考:
JAVA_OPTS="-server-Xms800m-Xmx800m-XX:
PermSize=64M-XX:
MaxNewSize=256m-XX:
MaxPermSize=128m-
Djava.awt.headless=true"
很大的web工程,用tomcat默认分配的内存空间无法启动,如果不是在myeclipse中启动tomcat可以对tomcat
这样设置:
TOMCAT_HOME/bin/catalina.bat中添加这样一句话:
setJAVA_OPTS=-server-Xms2048m-Xmx4096m-XX:
PermSize=512M-
XX:
MaxPermSize=1024M-Duser.timezone=GMT+08
或者
setJAVA_OPTS=-Xmx1024M-Xms512M-XX:
MaxPermSize=256m
如果要在myeclipse中启动,上述的修改就不起作用了,可如下设置:
Myeclipse->preferences->myeclipse->servers->tomcat-
>tomcatx.x->JDK面板中的OptionalJavaVMarguments中添加:
-Xmx1024M-Xms512M-XX:
MaxPermSize=256m
以上是转贴,但本人遇见的问题是:
在myeclipse中启动Tomcat时,提
示"ava.lang.OutOfMemoryError:
Javaheapspace",解决办法就是:
Myeclipse->preferences->myeclipse>servers->tomcat->tomcatx.x->JDK面板中的
OptionalJavaVMarguments中添加:
-Xmx1024M-Xms512M-XX:
MaxPermSize=256m
4、tomcat中如何禁止列目录下的文件
在{tomcat_home}/conf/web.xml中,把listings参数设置成false即可,如下:
vparam-name>listingsv/param-name>falsev/init-param>
vparam-name>listingsvparam-value>falsev/init-param>
5、Tomcat有几种部署方式
tomcat中四种部署项目方法
第一种方法:
在tomcat中的conf目录中,在server.xml中的,<host/>节点中
添加:
vContextpath="/hello"docBase=HD:
/eclipse3.2.2/forwebtoolsworkspacehello/WebRootHdebug="0"
privileged="true">
〈/Context〉
至于Context节点属性,可详细见相关文档。
第二种方法:
将web项目文件件拷贝到webapps目录中。
第三种方法:
很灵活,在conf目录中,新建Catalina(注意大小写)
\localhost目录,在该目录中新建一个xml文件,名字可以随意取,只要和当前文件中的文件名不重复就行了,该xml文件的内容为:
eclipse3.2.2forwebtoolsworkspaceheloWebRoot"
debug="0"privileged="true">
第3个方法有个优点,可以定义别名。
服务器端运行的项目名称
为path,外部访问的URL则使用XML的文件名。
这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。
第2、3还有优点,可以定义一些个性配置,如数据源的配置等。
第四种办法:
可以用tomcat在线后台管理器,一般tomcat都打开了,直接上传war就可以
6、Tomcat的优化经验
Tomcat作为web服务器,它的处理性能直接关系到用户体验,下面是种常见的优化措施:
•去掉对web.xml的监视,把jsp提前编辑成Servlet。
有富余物理内存的情况,加大tomcat使用的jvm的内存。
•服务器资源
服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。
•对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理
速度。
•内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx-Xms-XX:
MaxPermSize等参数对内存不同功能块进行划分。
我们之
前就遇到过内存分配不足,导致虚拟机一直处于fullGC,从而导致处理能力严重下降。
•硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。
最好的办法还是利用下面提到的缓存。
•利用缓存和压缩
对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。
这里我们采用了Nginx作为缓存服务器,将图片、css、js文件都进行了缓存,有效的减少了后端tomcat的访问。
另外,为了能加快网络传输速度,开启gzip压缩也是必不可少的。
但考虑到tomcat已经需要处理很多东西了,所以把这个压缩的工作就交给前端的Nginx来完成。
除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。
曾经我就见过一个图片从300多kb压缩到几十kb,自己几乎看不出来区别。
•采用集群
单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。
我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作。
可以参考之前写的
《利用nginx+tomcat+memcached组建web服务器负载均衡》。
•优化tomcat参数
这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,主要是优化连接配置,关闭客户端dns查询。
protocol=uorg.apache.coyote.http11.Http11NioProtocolHconnectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="20"
acceptCount="100"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding=“UTF-8“/>
1.2、JVM性能优化专题
1、Java类加载过程
Java类加载需要经历一下7个过程:
1.加载
加载是类加载的第一个过程,在这个阶段,将完成一下三件事情:
•通过一个类的全限定名获取该类的二进制流。
•将该二进制流中的静态存储结构转化为方法去运行时数据结构。
•在内存中生成该类的Class对象,作为该类的数据访问入口。
2.验证
验证的目的是为了确保Class文件的字节流中的信息不回危害到
虚拟机.在该阶段主要完成以下四钟验证:
•文件格式验证:
验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.
•元数据验证:
对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。
•字节码验证:
是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。
如:
方法中的类型转换是否正确,跳转指令是否正确等。
•符号引用验证:
这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。
3.准备
准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。
准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。
publicstaticintvalue=123;〃在准备阶段value初始值为0。
在初始化阶段才会变为123。
4.解析
该阶段主要完成符号引用到直接引用的转换动作。
解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。
5.初始化
初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。
到了初始化阶段,才真正开始执行类中的定义的java程序代码。
6.使用
7.卸载
2、java内存分配
•寄存器:
我们无法控制。
•静态域:
static定义的静态成员。
•常量池:
编译时被确定并保存在.class文件中的(final)|常量值和一些文本修饰的符号引用(类和接口的全限定名,字段的名称和描述符,方法和名称和描述符)。
•非RAM存储:
硬盘等永久存储空间。
•堆内存:
new创建的对象和数组,由Java虚拟机自动垃圾回收器管理,存取速度慢。
•栈内存:
基本类型的变量和对象的引用变量(堆内存空间的访问地址),速度快,可以共享,但是大小与生存期必须确定,缺乏灵活性。
1.Java堆的结构是什么样子的?
什么是堆中的永久代(PermGenspace)?
jva的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。
它在jvm启动的时候被创建。
对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。
存活的对象是应用可以访问的,不会被垃圾回收。
死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。
一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。
3、描述一下JVM加载Class文件的原理机制?
Java语言是一种具有动态性的解释型语言,类(Class)只有被加
载到JVM后才能运行。
当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序。
这个加载过程是由类加载器完成,具体来说,就是由ClassLoader和它的子类来实现的。
类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。
类的加载方式分为隐式加载和显示加载。
隐式加载指的是程序在使用new等方式创建对象时,会隐式地调用类的加载器把对应的类加载到JVM中。
显示加载指的是通过直接调用class.forName()方法来把所需的类加载到JVM中。
任何一个工程项目都是由许多类组成的,当程序启动时,只把需要的类加载到JVM中,其他类只有被使用到的时候才会被加载,采用这种方法一方面可以加快加载速度,另一方面可以节约程序运行时对内存的开销。
此外,在Java语言中,每个类或接口都对应一个.class文件,这些文件可以被看成是一个个可以被动态加载的单元,因此当只有部分类被修改时,只需要重新编译变化的类即可,而不需要重新编译所有文件,因此加快了编译速度。
在Java语言中,类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(例如基类)完全加载到JVM中,至于其他类,贝I」在需要的时候才加载。
类加载的主要步骤:
•装载。
根据查找路径找到相应的class文件,然后导入。
•链接。
链接又可分为3个小步:
•检查,检查待加载的class文件的正确性。
•准备,给类中的静态变量分配存储空间。
•解析,将符号引用转换为直接引用(这一步可选)
•初始化。
对静态变量和静态代码块执行初始化工作。
4、GC是什么?
为什么要有GC?
GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
5、简述Java垃圾回收机制。
在Java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。
在JVM中,有一个垃圾回