tomcat内存调优分析和总结.docx

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

PAGE

PAGE13/18

前言

Tomcat、Jetty、GlassFish等等这系列Web容器/应用服务器,虽然做为容器,提供的是一个JavaWeb的运行时环境,以支持Servlet/JSP等等这些内容的运行,但我们都很清楚,其本质上还是一个Java应用程序。每次对于容器的启动运行,都是把这个Java程序跑起来,来实现Web容器的能力。

做为一类“特殊”的Java应用程序,和任务其他的Java应用一样,需要使用到JVM,会有堆,会使用到垃圾回收,会涉及到不同的堆分区比例...

因此在对Web容器(应用服务器)的调优中必不可少的是对于JVM的调优。对于JVM的调优,主要有两个方面考虑:

内存大小配置

垃圾回收算法选择

当然,确切的说,以上两点并不互相独立,内存的大小配置也会影响垃圾回收的执行效率。

其中内存大小配置,最主要做的有

确定内存占用的总大小

确定内存中各个代(Gen)的大小划分

其它说明:

堆(Heap)和非堆(Non-heap)内存

按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)”。

可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,

所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。

tomcat内存溢出

Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,轻微时,会使系统性能急剧下降,严重时,将导致系统无法运行,影响系统的稳定性。当内存不够用时,常见的问题就是报tomcat内存益处错误,从儿导致客户端包500错误的,如下:解决方法主要是加大TOMCAT可利用内存,并在程序当中加大内存使用。因此根据应用的需求,有必要调整JVM使用内存的大小。

内存大小配置

所谓内存大小的占用,是指应用程序启动后稳定运行一小段时间时,观察到的内存占用情况。

以HotSpot虚拟机为例,Java堆主要有三个空间:新生代、老年代和永久代。

根据不同应用的特别,观察应用对于内存的占用,如果有大量的临时对象,不会重复使用,则可以调整NewGen,这样这些临时对象就在新生代创建完成,并在MinorGC产生时被回收,这样较短生存活的对象不会晋升到老年代,从而可以避免垃圾堆集产生FullGC。理想状态下,短期存活的对象都只在新生代完成生命周期,被费时劲少的MinorGC回

收完成,而长期存活,将会多次使用的在多次回收之后晋升到老年代,最终经过FullGC完成生命周期。

这里涉及到关于内存大小的调整参数有:

-Xms

-Xmx

这两个参数用于配置heap的起始大小和最大值。这里需要经过观察,找一个合适的值,设置太大会导致内存浪费,同时也会导致垃圾回收耗时太长。对于Tomcat来说,一般都会将初始值和最大值设置为相同值,这样就避免在初始内存不足时触发FullGC来进行扩展内存。

设定heap大小之后,要根据对象生命周期的特征,来调整新生代与老年代的大小比例。涉及到的参数有:

-XX:NewSize#直接指定新生代堆内存初始大小

-XX:NewRatio#设置新生代所占比例方式

-XX:MaxNewSize

-Xmn

第一个是直接设置新生代初始大小,第二个是设置比例(Ratio)。太高或太低都会导致GC不能高效的工作。毕竟MinorGC也是要耗时的。最后一个设置新生代的初始值和最大值相同,堆空间的变化不影响其值。

对于使用了大量第三方类库的应用来说,会加载许多框架依赖的类,使用过程中可能会遇到因为PermGen不足产生的OOM,这种情况可以通过观察稳定状态下Perm区的占用,再通过参数设置。

-XX:PermSize

-XX:MaxPermSize

-XX:MaxMetaspaceSize

第一个会设置Perm(永生代)区的初始大小,第二个用于设置Perm区的最大值。在Java8的时候,Perm区被移除,改为Metaspace,不过如果遇到类似的OOM,依然可以调整其大小。

此外,对于使用大量线程的应用,也可以配置-Xss,主要用于设置单个线程的stack大小。注意,是单个的大小,因此设置值越大,会占用越大,可用的线程数也就越少。

这里的配置一般对于-

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档