为什么80%的码农都做不了架构师?>>>   

常见的内存溢出有以下两种:

java.lang.OutOfMemoryError: PermGen space

java.lang.OutOfMemoryError: Java heap space

———————————————————

这里以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。

一、java.lang.OutOfMemoryError: PermGen space

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法: 手动设置MaxPermSize大小
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

二、java.lang.OutOfMemoryError: Java heap space
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:手动设置Heap size

Linux下修改JVM内存大小:

要添加在tomcat 的bin 下catalina.sh 里,位置cygwin=false前 。注意引号要带上,红色的为新添加的.

#java jvm size JAVA_OPTS=" -server -Xms8000m -Xmx8000m -XX:PermSize=1000m -XX:MaxPermSize=1500m"   cygwin=false

windows下修改JVM内存大小:

情况一:解压版本的Tomcat, 要通过startup.bat启动tomcat才能加载配置,要添加在tomcat 的bin 下catalina.bat 里

找到这行:rem Guess CATALINA_HOME if not defined

set “CURRENT_DIR=%cd%”后面添加下面代码

set JAVA_OPTS=-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true

情况二:安装版的Tomcat下没有catalina.bat

windows服务执行的是bin/tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.修改注册表
HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Tomcat Service Manager/Tomcat5/Parameters/JavaOptions
原值为

-Dcatalina.home=”C:/ApacheGroup/Tomcat 5.0″
-Djava.endorsed.dirs=”C:/ApacheGroup/Tomcat 5.0/common/endorsed”
-Xrs

加入 -Xms300m -Xmx350m 重起tomcat服务,设置生效

各参数的比例:

Xmx 与PermSize的和不可超过JVM可获得的总内存 PermSize不可大于Xmx

如何设置Tomcat的JVM虚拟机内存大小

可以给Java虚拟机设置使用的内存,但是如果你的选择不对的话,虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。-Xms JVM初始化堆的大小 -Xmx JVM堆的最大值

这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在 大负载的 情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须 重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程 序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最 大值设置为可用内存的最大值的80%。
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。

Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:

JAVA_OPTS=’-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】’需要把这个两个参数值调大。例如:

JAVA_OPTS=’-Xms256m -Xmx512m’表示初始化内存为256MB,可以使用的最大内存为512MB。

另 外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析 实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快, 但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小 设大,保证垃圾收集不在整个基准测试的过程中出现。
如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

第二步 – 解决JRE内存泄露

性能表现不佳的另一个主要原因是内存泄漏,正如我之前说过:始终使用最新的tomcat服务器以获得更好的性能和可伸缩性。现在,这句话变成真的。 如果我们使用最新的tomcat版本6.0.26及以上就可以解决这个错误,因为它包含了一个监听器来处理JRE和PermGen的内存泄漏。使用的监听 器是,

<Listener className=”org.apache.catalina.core.JreMemoryLeakPreventionListener” />
你可以在server.xml文件中找到这个监听器的配置,server.xml位置在“tomcat project folder/conf/server.xml”。接下来,我们将看看如何调整连接属性“maxThreads”。

第三步 – 线程池设置

线程池指定Web请求负载的数量,因此,为获得更好的性能这部分应小心处理。可以通过调整连接器属性“maxThreads”完成设置。 maxThreads的值应该根据流量的大小,如果值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状态,只有当一个的处理线程释放后才被处 理;如果设置的太大,Tomcat的启动将花费更多时间。因此它取决于我们给maxThreads设置一个正确的值。

在上述配置中,maxThreads值设定为“250”,这指定可以由服务器处理的并发请求的最大数量。如果没有指定,这个属性的默认值为“200”。任何多出的并发请求将收到“拒绝连接”的错误提示,直到另一个处理请求进程被释放。错误看起来如下,

org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) are
currently busy, waiting. Increase maxThreads (250) or check the servlet status

如果应用提示上述错误,务必检查上述错误是否是由于单个请求花费太长时间造成的,这个问题的原因是这样的,有时候如果数据库连接不释放的话,进程将不会处理其它请求。

注意: 如果请求的数量超过了“750”,这将不是意味着将maxThreads属性值设置为“750”,它意外着最好使用“Tomcat集群”的 多个实例。也就是说,如果有“1000”请求,两个Tomcat实例设置“maxThreads= 500”,而不在单Tomcat实例的情况下设置maxThreads=1000。

根据我的经验,准确值的设定可以通过将应用在在各种环境中测试得出。接下来,我们来看看如何压缩的MIME类型

第4步- 压缩

Tomcat有一个通过在server.xml配置文件中设置压缩的选项。压缩可以在connector像如下设置中完成

在前面的配置中,当文件的大小大于等于500bytes时才会压缩。如果当文件达到了大小但是却没有被压缩,那么设置属性compression=”on”。否则Tomcat默认设置是“off”。接下来我们将看看如何调优数据库。

第五步- 数据库性能调优

Tomcat性能在等待数据库查询被执行期间会降低。如今大多数应用程序都是使用可能包含“命名查询”的关系型数据库。如果是那样的 话,Tomcat会在启动时默认加载命名查询,这个可能会提升性能。另一件重要事是确保所有数据库连接正确地关闭。给数据库连接池设置正确值也是十分重要 的。我所说的值是指Resource要素的最大空闲数(maxIdle),最大连接数(maxActive),最大建立连接等待时间(maxWait)属 性的值。因为配置依赖与应用要求,我也不能在本文指定正确的值。你可以通过调用数据库性能测试来找到正确的值。

第6步 – Tomcat原生库

Tomcat的原生库基于Apache可移植运行时(Apache Portable Runtime简称APR),给程序员提供了超强的扩展性和性能,在产品运作中帮助融合原生的服务器技术以展现最佳的性能。想知道安装说明的朋友请参考 Tomcat Native Library – (APR) Installation。

第7步 – 其他选项

这些选项是:

开启浏览器的缓存,这样读取存放在webapps文件夹里的静态内容会更快,大大推动整体性能。每当开机时,Tomcat服务器应当自动地重启。一般情况下HTTPS请求会比HTTP请求慢。如果你想要更好的安全性,即使慢一点我们还是要选择HTTPS。

最大连接数等配置

Tomcat的server.xml中Context元素的以下参数都是什么意思?

maxThreads="150" 表示最多同时处理150个连接 minSpareThreads="25" 表示即使没有人使用也开这么多空线程等待 maxSpareThreads="75" 表示如果最多可以空75个线程,例如某时刻有80人访问,之后没有人访问了,则tomcat不会保留80个空线程,而是关闭5个空的。 acceptCount="100" 当同时连接的人数达到maxThreads时,还可以接收排队的连接,超过这个连接的则直接返回拒绝连接。 另外: 在tomcat配置文件server.xml中的配置中,和连接数相关的参数有: minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10 maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75 acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100 enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。

我的配置是:
maxThreads=”300″
minSpareThreads=”25″
maxSpareThreads=”100″
acceptCount=”100″
minProcessors=”20″
maxprecessors=”150″
enableLookups=”false”
compression=”on”
compressionMinSize=”2048″
protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
–>

转载于:https://my.oschina.net/yygh/blog/669843

Linux下tomcat内存溢出分析及优化相关推荐

  1. Linux 下Tomcat内存溢出解决方式

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在启动的 ...

  2. linux查看tomcat启动内存溢出,Linux下 Tomcat内存溢出

    Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个Java虚拟机.JAVA程序启动时JVM会分配一个初始内存和最大内存给APP.当APP需要的内存超出内存的最大值时虚拟机就会提示内存溢出 ...

  3. linux下Java内存溢出排查

    1.查询gc情况(每1秒钟打印一次gc情况) jstat -gcutil pid 1000:1 查询结果含义: S0:幸存区1占用率 S1:幸存区2占用率 E:Eden区占用率 O:老年区占用率 M: ...

  4. Linux 下 Tomcat 内存大小配置

    找到 TOMCAT_NOME/bin/catalina.sh 文件加入以下代码: JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=12 ...

  5. linux环境下内存溢出分析MAT

    文章目录 1 下载及安装mat 1.1 下载地址 1.2 查看服务器版本 1.3 下载安装 2 配置 3 运行 4 分析 1 下载及安装mat 1.1 下载地址 https://www.eclipse ...

  6. div固定大小文字溢出自动缩小_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!

    写在前面 随着系统并发量越来越高,Tomcat所占用的内存就会越来越大,如果对Tomcat的内存管理不当,则可能会引发Tomcat内存溢出的问题,那么,如何防止Tomcat内存溢出呢?我们今天就来一起 ...

  7. oom 如何避免 高并发_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!...

    [高并发]高并发环境下如何防止Tomcat内存溢出?看完我懂了!! 发布时间:2020-04-19 00:47, 浏览次数:126 , 标签: Tomcat 写在前面 随着系统并发量越来越高,Tomc ...

  8. Tomcat内存溢出原因分析

    Tomcat内存溢出的原因  在生产环境中tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一样的,当然处理方式也不一样. 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三 ...

  9. linux/centos 解决Tomcat内存溢出,centostomcat

    2019独角兽企业重金招聘Python工程师标准>>> linux/centos 解决Tomcat内存溢出,centostomcat Tomcat本身不能直接在计算机上运行,需要依赖 ...

最新文章

  1. Jenkins首次安装推荐插件出错 No such plugin: cloudbees-folder 超详细解决方案
  2. 《评人工智能如何走向新阶段》后记(再续12)
  3. UML图系列——建模和面向对象
  4. fullcalendar5.X版本 显示自定义html内容
  5. 设计模式- 策略模式
  6. git: command not found
  7. 《101 Windows Phone 7 Apps》读书笔记-BABY MILESTONES
  8. 虚拟机如何连接服务器系统,Horizon 连接服务器最大连接数和虚拟机配置
  9. zipimport — Import modules from Zip archives¶
  10. freemarker java静态方法_java Freemarker页面静态化实例详解
  11. SystemView 应用笔记
  12. 点分十进制IP转换为32位二进制IP,带合法性校验
  13. windows11鼠标滚轮反向
  14. 苹果手机数据线正确鉴定方法
  15. 文件23333333
  16. 《软技能--代码之外的生存指南》学习笔记之自我营销篇
  17. eclipse中一些常见的报错处理
  18. astype函数的使用
  19. Python练习——L1-051 打折 (5分)
  20. json对象遍历输出key和value

热门文章

  1. Eclipse打包工具 FatJAR
  2. android关于设置list_item高度问题
  3. HTML5学习笔记简明版(3):新元素之hgroup,header,footer,address,nav
  4. 框架学习之Spring 第五节 SSH整合开发[Spring2.5+Hibernate3.3+Struts2]
  5. 《信息与电脑》流通业在SaaS模式下的在线应用
  6. DOTA系列 食尸鬼(小狗)攻略
  7. Object类的用法(三)
  8. 存储过程编写经验和优化措施
  9. 利用DHCP,http,tftp,pxe实现批量自动化部署系统
  10. C++类的构造函数不能为虚函数的原因