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

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

因此在对Web 容器( 应用服务器) 的调优中必不可少的是对于 JVM 的调优。

对于 JVM 的调优,主要有两个方面考虑:

  • 内存大小配置

  • 垃圾回收算法选择

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

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

  • 确定内存占用的总大小

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

内存大小配置

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

以 HotSpot 虚拟机为例,Java 堆主要有三个空间:

新生代、老年代和永久代。

根据不同应用的特别,观察应用对于内存的占用,如果有大量的临时对象,不会重复使用,则可以调整 New Gen, 这样这些临时对象就在新生代创建完成,并在 Minor GC 产生时被回收,这样较短生存活的对象不会晋升到老年代,从而可以避免垃圾堆集产生 Full GC。

理想状态下,短期存活的对象都只在新生代完成生命周期,被费时劲少的

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

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

  • -Xms

  • -Xmx

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

设定 heap 大小之后,要根据对象生命周期的特征,来调整新生代老年代的大小比例。

涉及到的参数有:

  • -XX:NewSize

  • -XX:NewRatio

  • -XX:MaxNewSize

  • -Xmn

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

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

  • -XX:PermSize

  • -XX:MaxPermSize

  • -XX:MaxMetaspaceSize

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

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

这里的配置一般对于-X开始的可以直接在后面用数字加单位,而-XX的则需要等号后数字再加单位,例如:

java -Xms100m -Xmx200m -XX:PermSize=300m

这里数字后的单可以是m,g,k代表计算机中的不同单位。

那我们前面一直在说根据不同的应用,观察分析设置堆的大小,堆的各个代的大小,那具体观察什么呢?

我们一般在JVM的配置中增加一些打印 GC 日志的选项,配置方式和上面的类似,这样在 GC 产生时,会打印出各个代占用的大小,具体触发时间等。推荐的配置有以下几个:

  • -XX:+PrintGCTimeStamps

  • -XX:+PrintGCDetails

  • -Xloggc:

  • -XX:PrintGCDateStamps

第一个和第四个选项可以任选一个,第一个打印自JVM启动以来的时间,一般也称为uptime, 第四个打印的是系统当前日期和时间。

根据 GC 日志产生的内容,来观察具体的大小,开始使用上述的配置参数进行调整。当然,也可以用 JConsole, JVisual VM 这些工具可视化的进行了解再调整。

垃圾回收算法

不同的垃圾回收算法,对于应用的影响很大。一方面可能在一个服务器上却使用了单线程的回收算法,也可能应用对于响应要求很高,但却使用了一个吞吐量优先的算法,导致响应太慢。

所以对于垃圾回收算法的选择,一般都是根据应用的特点,是要低延迟还是高吞吐量,选择合适的算法。我们前面也提到,垃圾回收算法和内存的大小配置并非独立的,内存设置大是回收的频率会降低,但每次的执行时间也会变长。所以这里也是一个需要权衡的地方。

  • 延迟、吞吐量调优

  • 其他 JVM 配置

垃圾回收算法对应到的就是不同的垃圾收集器,具体到在 JVM 中的配置,是使用 -XX:+UseParallelOldGC 或者 -XX:+UseConcMarkSweepGC 这种不同的收集器来达到选择算法的目的。

其中 ParallelGC 也称为 吞吐量优先收集器,可以提升应用的吞吐量,但在老年代大小调整之,进行几次垃圾回收后,不能满足应用的低延迟要求。

一般常用到ConcMarkSweepGC, 也称之为 CMS GC,其可以做到老年代的垃圾回收与应用程序的纯种并行执行,所以可以实现低延迟。

这里注意,由于 CMS GC 和其他GC回收算法使用的框架不同,因此不能混用,在使用CMS 进行老年代回收时,新生代默认使用了单线程回收算法,此时可以通过配置 -XX:+UseParNewGC来使用 新生代并行回收。

由于CMS是垃圾回收和应用线程并行,因此需要额外的CPU处理资源,如果只有一个CPU的机器,或者有多个忙碌的CPU,又想要使用低延迟的收集器,此时可以通过配置 CMS 收集器的增量模式来进行回收,通过指定 -XX:+CMSIncrementalMode 来开启增量模式。此时交替运行垃圾收集器应用线程。通过配置

-XX:CMSIncrementalSafetyFactor=X, -XX:CMSIncrementalDutyCycleMin=Y,

-XX:CMSIncrementalPacing 可以控制垃圾收集后台线程为应用线程让出多少CPU周期。

参数-XX:+CMSParallelRemarkEnabled 用来降低标记停顿,另外由于CMS 回收后的老年代内存空间并不是连续的,因此通过参数

-XX:+UseCMSCompactAtFullCollection 在Full GC的时候对年老代的压缩。

在JDK1.7 的时候引入了 G1 收集器,可以通过配置-XX:+UseG1GC 来开启。这一方面的实战经验不多,有相关使用经验的朋友欢迎分享。

此外,还可以对新生代进行更细致的配置,比如设置Eden 和 Suvivor 区的比例等,和Newxx类似,可以通过SuvivorRation设置比例。

其他 JVM 配置

可以使用 -XX:+DisableExplicitGC 选项来禁止显式的 System.gc 的调用。这个使用时需要评估后再使用。

所谓调优,就是一个不断调整和优化的过程,需要观察、配置、测试再如此重复。有相关经验的朋友欢迎留言补充!

说到底,那上面的这些选项是要配置在哪里呢? 我们前面提到 Tomcat 本质也是个普通的 Java 应用,因此和一般的 Java 启动方式类似,也是类似

java -Xms100m -XX:+UseParallelOldGC 应用主类

通过这种形式来启动,区别只是 Tomcat 将上述命令放到了文件中,对应到不同的操作系统,Windows下使用 bat文件, Linux下使用 sh 文件。

所以我们的配置项也是加到这些文件中。

我们来看catalina.sh中实际启动时执行的命令:

所以我们的选项可以加到

JAVA_OPTS

CATALINA_OPTS

这些可选项中。

配置比较简单,例如下面这样:

配置的时候需要特别注意的是,不要把前面已经有的配置冲掉,比如

在配置JAVA_OPTS的时候,要把前面已经配置的加上,写起来是这样:

JAVA_OPTS="$JAVA_OPTS 新增的内容"

文章转自:Tomcat那些事儿

tomcat内存占用过高_Tomcat 性能调优之 JVM 调优相关推荐

  1. Windows下Tomcat内存占用过高问题跟踪(ProcessExplorer+jstack)

    一.问题描述 Tomcat下面部署很多个java项目的war包,tomcat启动一段时间后,发现cpu占用过高,整个界面卡死! 二.通过process explorer查看java进程下的线程 pro ...

  2. UE 手游在 iOS 平台运行时内存占用太高?试试这样着手优化

    性能优化,对游戏开发来说是一个需要不断钻研的课题,性能越好,游戏才会运行的更加顺畅,玩家的体验感才会更好.腾讯游戏学院专家.游戏客户端开发 Leonn,将和大家分享 UE 手游在 iOS 平台上的内存 ...

  3. 如何占用计算机内存,电脑内存占用太高怎么办 教你电脑内存不够用解决方法...

    现在很多白领买电脑,都会优先考虑电脑的续航和便捷,因为他们买电脑主要也就办办公,看看电影,又不玩大型游戏,所以高性能对他们来说也没什么必要. 笔记本电脑 但现在市面上续航久,便携性比较高的Intel电 ...

  4. linux内存占用过高怎么解决,centos7内存占用过高处理方法

    博士有几台frps服务器都出现了内存占用过高的现象,然后会出现CPU使用率飙升,网上找到这个清理buff/cache缓存脚本,希望有效果. 博士在找到这个脚本的时候也学到了一个关于Linux的知识点, ...

  5. win10系统升级一段时间后,内存占用过高

    电脑升级系统后,使用一段时间都是正常的,电脑开机之后内存占用率基本在20-30%之间,过一段时间开机后内存占用率飙升,内存基本占用60%以上,由于磁盘I/O也比较高,百度基本都是禁用superfetc ...

  6. 解决:win10一开机,内存占用过高,有的达到70%的办法

    我们先来找原因:根据微软大中华区工程师返回的邮件信息得知:win10一开机,内存占用过高,主要是原因是由于Win10 SuperFetch 超级预读服务的问题:"Windows10的Supe ...

  7. Shared UI Mesh内存占用过高

    1)Shared UI Mesh 内存占用过高 ​2)GPU Skinning有办法实现阴影的做法吗 3)在真机上特效不跟着Spine运动 4)复制AnimatorController无效问题 5)P ...

  8. linux nginx 内存占用,nginx内存占用过高

    nginx内存占用过高.md 现象 nginx运行一段时间后,内存占用非常高,超出系统最大内存后,开始使用SWAP,直至SWAP用尽,系统崩溃.内核参数vm.swappiness = 1. 如图: 监 ...

  9. 一次jvm导致线上内存占用过高问题定位

    背景:8G物理内存,8核CPU,jvm使用的G1垃圾回收器. 问题:线上内存占用告警,内存占用超过85%,且现象一直持续. 分析 看一下jvm启动参数配置: -Xms6144m -Xmx6144m - ...

最新文章

  1. To handle Unhandled Exception
  2. [译] D3.js 嵌套选择集 (Nested Selection)
  3. 【算法系列之万字总结常用的查找算法,持续补充更新中】
  4. 二叉树遍历(信息学奥赛一本通-T1364)
  5. SAP License:特殊采购类型-寄售及其结算
  6. 单片机电源自动切换电路,mos双电源自动切换电路,电池与usb供电自动切换电路
  7. Android10apk怎么传数据,Android不同apk之间传递参数与数据
  8. 如何减小电压跟随器输出电阻_补课贴 | 关于运算放大器和比较器的异同,那些你不得不知道的小知识!...
  9. oracle存储过程实例带参数,oracle简单存储过程(带参数)
  10. java 经纬度的距离计算工具包
  11. 产业分析:2021抖音数据报告
  12. 华为鸿蒙系统英语报纸_“鸿蒙”系统的英文名叫这个!华为注册的这些名字都该怎么翻译?...
  13. 01、本地微信服务器测试环境
  14. 机房用计算机桌,机房电脑桌椅的正常尺寸是多少
  15. getchar() 和 getch()
  16. Python-使用海龟绘图制作动态时钟
  17. 液晶显示器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. KEPServerEX助力能源巨擎实现工业4.0
  19. IDEA创建一个JavaWeb项目详细步骤
  20. C语言讲义——错误处理

热门文章

  1. 1、eclipse 使用git提交项目至github进行项目托管
  2. 谷歌紧急更新,Chrome 今年第二个零日漏洞曝光
  3. 鸿蒙OS最快6月正式推送;微信Windows版将支持刷朋友圈;GCC 11.1正式发布|极客头条...
  4. Android 12 预览版发布,64G手机用户:我又活了
  5. 中台“不火”了,企业数智转型如何破圈?
  6. 由浅入深,解决三道【只出现一次的数】!
  7. 乌镇百度大脑开放日召开,重磅发布“乘风人脸通行考勤平台”
  8. 程序员的自我救赎,GitHub 摸鱼神器一览
  9. 中国 GitHub 开发者数量年增长 37%,为全球最快
  10. 腾讯回应 QQ 被工信部通报;由微软老兵领导,Facebook 开发新操作系统;Node.js 13.4.0 发布 | 极客头条...