百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

性能测试能力提升-JVM GC监控和优化

gudong366 2025-07-20 00:56 4 浏览

一、背景

接着上一篇的知识:性能测试能力提升-JVM GC原理,本篇文章,我们将主要介绍JVM GC监控和优化相关的知识:

  • 命令行方式监控GC
  • 图形化方式监控GC
  • 什么时候需要开始GC优化?
  • GC优化的目的
  • GC优化的步骤
  • 常用JVM参数配置实例

二、JVM GC监控

2.1 命令行方式监控GC

1、Linux下使用命令:which java, 找到JDK目录;

2、在JDK的bin目录下,使用命令:jps 查看JVM进程PID。 或者也可以使用:

ps -ef | grep java 

查看Java进程PID,信息也更多一些;



3、使用命令: jstat -gc 18004 1000 即可监控GC情况。其中: 18004是JAVA进程的端口号, 1000表示1000毫秒,也就是每隔一秒展示GC监控数据;


S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:Eden区的大小
EU:Eden区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC: 压缩类空间大小
CCSU: 压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

2.2 图形化方式监控GC

1、xshell 登录远程服务器,输入命令:which java, 找到Java的目录在哪里。

2、到Java目录下的/jre/lib/security下,修改 java.policy这个文件的内容:

vim java.policy,

在文件末尾的 }; 前添加 permission
java.security.AllPermission。


3、到Java目录的bin目录下,比如:/usr/java/jdk1.8.0_60/bin, 执行下面的命令,开启jstatd:

./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=xx.xx.xx.xx &

xx.xx.xx.xx是你远程服务器的IP。



4、本地java安装目录下:
C:\Program Files\Java\jdk1.7.0_80\bin,
运行jvisualvm.exe,
添加远程主机,VisualVM会自动检测到jstatd连接并添加节点。


三、JVM GC优化

3.1 什么时候需要开始GC优化?

1、如果你没有设定过JVM参数,使用的是默认参数,而系统充斥着大量的超时日志时,你就需要在你的系统中进行GC优化了;

2、在检查GC状态的过程中,你应该分析监控结果以便决定是否进行GC优化,如果分析结果表明执行GC的时间只有0.1-0.3秒,那你就没必要浪费时间去进行GC优化。但是,如果GC的执行时间是1-3秒,或者超过10秒,GC将势在必行;

3、但是,你需要时刻铭记一条:GC优化永远是最后一项任务。当出现性能问题时,如果你已经设置过JVM参数,那么GC优化永远不应该是第一优先选项,先排除服务器、数据库、程序代码常见性能问题后,再着手监控优化GC也不迟。

3.2 GC优化的目的

GC优化的主要目的有两个:
1、将转移到老年代的对象数量降低到最小;
2、减少full GC的执行时间;

为了达到上面的目的,一般地,你需要做的事情有:
1、减少使用全局变量和大对象(应用代码层面);
2、调整新生代的大小到最合适(JVM参数);
3、设置老年代的大小为最合适(JVM参数) ;
4、选择合适的GC收集器(JVM参数) ;

3.3 GC优化的步骤

1、监控GC状态:
首先你需要监控GC来检查在系统执行过程中GC的各种状态;

2、分析监控结果,决定是否进行GC优化:
分析监控结果,判断是优化应用程序代码 OR 优化JVM参数 OR 代码&参数都优化。代码优化就交给开发大哥自己玩儿去吧。参数优化看下面几条。

3、JVM参数优化:
主要为两方面:堆大小设置 和 GC收集器设置。

4、分析结果:
在调整了GC参数并持续收集24小时之后,开始对调整后结果进行分析。通过不断的调整GC收集器设置和堆大小设置找到最佳的参数配置。

5、如何最快的完成GC优化:
对比性能测试的结果应该是最快的方法,为每一台服务器设置不同的参数并监控他们的状态,强烈建议至少监控1或2天的数据。

6、网上别人的参数优化配置是否我可以照搬使用:
可以借鉴,但适合别人的服务器配置,不一定适合你的服务器配置,尤其是参数后的 value(值)是需要根据你自己的实际情况来设置的。

3.4 常用JVM参数配置实例

设置方式:
LINUX下查看Tomcat的目录:sudo find / -name tomcat, 然后到bin目录下,打开catalina.sh, 设置JAVA_OPTS=设置JVM参数;

之前某web项目的JVM优化后的参数配置如下:
JAVA_OPTS=“
-Xms512m
-Xmx6G
-Xmn3G
-XX:SurvivorRatio=4
-XX:MaxTenuringThreshold=3
-XX:ParallelGCThreads=12
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC

-XX:CMSInitiatingOccupancyFraction=75

-XX:+CMSPermGenSweepingEnabled

-XX:CMSInitiatingPermOccupancyFraction=85

-XX:+DisableExplicitGC

-XX:CMSFullGCsBeforeCompaction=3

-XX:+
UseCMSCompactAtFullCollection

-XX:+
UseCMSInitiatingOccupancyOnly

-XX:+CMSParallelRemarkEnabled
-XX:+CMSIncrementalMode”

各参数解释

堆大小设置
-Xmx6G:设置JVM最大可用内存为6G;
-Xms512m:设置JVM初始内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存;
-Xmn3G:设置年轻代大小为3G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8;
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6;
-XX:MaxTenuringThreshold=3:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

GC收集器设置:
-XX:ParallelGCThreads=12:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等;
-XX:+UseParNewGC: 设置年轻代使用ParNew收集器 。可与CMS收集同时使用;
-XX:+UseConcMarkSweepGC:设置年老代使用CMS收集器;

-XX:CMSInitiatingOccupancyFraction=75
:老年代使用75%后开始CMS收集;
-XX:+CMSPermGenSweepingEnabled:允许对持久代进行GC;

-XX:CMSInitiatingPermOccupancyFraction=85
:持久代使用85%后触发GC;
-XX:+DisableExplicitGC:禁用“System.gc()”, 避免程序代码手动触发FULL GC;

-XX:CMSFullGCsBeforeCompaction=3
:由于CMS收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:+
UseCMSCompactAtFullCollection
:在FULL GC的时候,对老年代的内存空间进行压缩。可能会影响性能,但是可以消除碎片 ;
-XX:+
UseCMSInitiatingOccupancyOnly
:使用手动定义初始化定义开始CMS收集,禁止自行触发CMS GC;
-XX:+CMSParallelRemarkEnabled: 降低标记停顿,减少标记耗时;
-XX:+CMSIncrementalMode:使用增量模式,在增量模式下,CMS 收集器在并发阶段,不会独占整个周期,而会周期性的暂停,唤醒应用线程,把cpu资源让给正在运行的应用
。收集器把并发阶段工作,划分为片段,安排在次级(minor) 回收之间运行。这对需要低延迟,运行在少量CPU服务器上的应用很有用。

其他常用参数设置:
-XX:NewRatio=4: 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5。如果设置了-Xmn, 此设置无效;
-Xss128k: 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右;
-XX:MaxPermSize=16m: 设置持久代大小为16m,持久代一般默认大小为64m ;

这样配置后,基本上能达到:
系统响应时间增快;
JVM回收速度增快同时又不影响系统的响应率;
JVM内存最大化利用;
线程阻塞情况最小化;

===============================

以上就是本次的全部内容,下一篇文章,我们将主要介绍以下方面的知识:

  • 什么时候开始考虑做全链路压测
  • 全链路压测前梳理
  • 全链路压测方法

如果对你有帮助,欢迎关注我的微信公众号:程序员杨叔,各类文章都会第一时间在上面发布,持续分享全栈测试知识干货,你的支持就是作者更新最大的动力~

相关推荐

梦幻诛仙12职业1亿元宝版本架设教程(包含资源下载)

架设教程:1;上传脚本zx到bin文件夹,给权限chmod-R777/bin2;输入zx安装宝塔面板输入对应序号,中途输入Y继续3;安装好之后,会给个宝塔地址及账号密码,复制地址...

Java零基础入门,科普Java你应该了解什么

最近很多人问我想学Java但是一点基础没有,网上看了一堆学习线路图还是无从下手。今天耗时3小时整理了一套保姆级的Java入门教程,建议收藏按照线路图一点点学习。一、Java的概况Java是1995年6...

01.Java发展历史(java发展历史简要)

1.Java发展历史Java由SunMicrosystems公司(现为Oracle公司)的JamesGosling及其团队在1991年开发,最初命名为"Oak",后改名为"...

Ubuntu16.04.1安装Java8(ubuntu终端安装java)

上篇文章讲解了怎么在Windows下安装Java8《Windows10安装Java8》,这里讲解下怎么在Linux下安装Java。由于之前已经安装了Ubuntu16.04.1《VmwareWorkst...

性能测试能力提升-JVM GC监控和优化

一、背景接着上一篇的知识:性能测试能力提升-JVMGC原理,本篇文章,我们将主要介绍JVMGC监控和优化相关的知识:命令行方式监控GC图形化方式监控GC什么时候需要开始GC优化?GC优化的目的GC...

Spring Boot Jar 包秒变 Docker 镜像实现多环境部署

你是否在互联网大厂后端开发工作中,遇到过这样的困扰?当完成一个SpringBoot项目开发,准备将Jar包部署到不同环境时,却发现各个环境依赖不同、配置复杂,部署过程繁琐又容易出错,不仅耗费...

「JDK 11」关于 Java 模块系统,看这一篇就够了

继2014年3月Java8发布之后,时隔4年,2018年9月,Java11如期发布,其间间隔了Java9和Java10两个非LTS(LongTermSupp...

对Java学习的10条建议(对java的认识和理解)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

JAVA入门教程-第1章 概述(java入门指南)

大道至简-JAVA入门教程在本教程中,你将学习Java语言的基础知识。Java基础内容涵盖:Java基础概念、Java词法结构、Java数组、Java流程控制、Java字符串、Java...

推荐一款Java音频视频编码器,很赞

Jave2是什么JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器。开发人员可以利用JAVE2将音频和视频文件从一种格式转码为另一种格式。在示例中,您可以将AVI文件转换为MP...

【JAVA教程】JAVA入门及开发环境安装

一、Java开发环境概述Java开发需要三个核心组件:JDK(JavaDevelopmentKit)-Java开发工具包,开发、编译、调试Java程序JRE(JavaRuntimeE...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

记Tomcat优化方案(tomcat优化的几种方法)

Tomcat服务吞吐量评估方案问题:评估方案在一台8核16G的linux服务器上,使用tomcat容器部署服务。在正常情况下如何评估这个tomcat服务可处理的连接数,即服务的吞吐量,请在正常情况下考...

JVM GC诡异问题排查,k8s差点害死我……

前言本文将通过一个真实的生产环境案例,详细展示如何系统性地排查和解决JVM垃圾收集问题。这个案例涵盖了从问题发现、分析诊断到最终解决的完整过程,对于理解JVM调优实战具有重要的参考价值。系统背景我们的...

Thorium Reader - 功能强大的跨平台免费电子书阅读器

在日常阅读日益普及的今天,选择一款合适的电子书阅读器至关重要。ThoriumReader作为一款独具特色的阅读应用,正逐渐在众多同类产品中崭露头角,为用户带来了卓越的阅读体验。  跨平台的便捷性...