Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
Tomcat与Java虚拟机关系
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。 JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明,一般的JAVA程序在运行都可以通过-Xms -Xmx来调整应用程序的初始内存和最大内存:
设置-Xms -Xmx:
这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。
由于以上原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
常见异常
1.java.lang.OutOfMemoryError: Javaheap space ----(堆)溢出
JVM在启动的时候会自动设置JVMHeap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。可以利用JVM提供的-Xmn -Xms-Xmx等选项可进行设置。
在JVM中如果98%的时间是用于垃圾收集,且可用的Heap size不足2%的时候将抛出此异常信息。提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
方案:下面方式一(修改)
2.java.lang.OutOfMemoryError:PermGen space ---- 永久保存区域溢出。
PermGen space的全称是Permanent Generationspace,是指内存的永久保存区域。
为什么会内存溢出?
因为这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGenspace区域,它和存放Instance的Heap区域不同,sun的垃圾回收机制不会在主程序运行期对PermGenspace进行清理,所以如果你的APP会载入很多CLASS的话,就很可能出现PermGen space溢出。如果你的WEB APP下都用了大量的第三方jar, 其大小 超过了jvm默认的大小(4M)那么就会产生此错误信息了。
方案: 下面方式一(修改)
-Xms:java Heap初始大小。默认是物理内存的1/64。
-Xmx:javaheap最大值。建议均设为物理内存的一半。不可超过物理内存。
-XX:PermSize:设定内存的永久保存区初始大小,缺省值为64M。
-XX:MaxPermSize:设定内存的永久保存区最大大小,缺省值为64M。
注:
虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。
调整堆大小的的目的:最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。
解决方法:
1、常规Tomcat安装(方式一)
找到服务器地址下的catalina.bat
如:G:\项目提升\铁科院\沪昆湖南调研\program\adjust\apache-tomcat-6.0.36\bin\catalina.bat
在rem Guess CATALINA_HOME if not defined上面添加
set"JAVA_OPTS=-Xms512M-Xmx1024M -XX:PermSize=192m -XX:MaxPermSize=256m"
2、Tomcat作为服务
如果你的tomcat是注册为windows服务并且是以服务方式启动的,那么上面的方法就无效了,因为这时tomcat启动是读取注册表的参数,而不是读取批处理文件的参数,这时我们有两种方法来设置jvm参数。
扩大Tomcat服务内存,而不是Tomcat内存(在这里Tomcat被注册为一种服务)
方法1: tomcat为我们提供了一个设置启动参数的窗体,双击tomcat_home/bin目录下的tomcat7w.exe,如图
(1)添加参数
(2)增大内存
Initial memory pool:初始化的Java虚拟机内存大小,
Maxinum memory pool: Java虚拟机可使用的最大内存
注:通过windows服务启动的,内存调节不起作用。
方法2:
打开注册表->HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun2.0\Tomcat6\Parameters\Java(路径可能有一点点差别)
修改Options的值,把刚才上面那些参数加进去就OK了。
小结:
为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?
1)参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;
2)-Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。需要说明一点的是,如果你的物理内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。