jvm调优

文章详细列举了一系列Java应用的JVM启动参数,涉及垃圾收集器的选择和配置,如ParallelScavenge、CMS、G1等,以及不同收集器的优缺点和调优步骤。通过调整如-Xms、-Xmx、-Xmn、-XX:MetaspaceSize等参数来优化内存分配,目标是减少停顿时间和提高吞吐量。文章还介绍了使用gceasy和GCViewer等工具进行GC日志分析,并给出了实际的调优案例和结果。
摘要由CSDN通过智能技术生成

1、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-gateway-1.0.0.RELEASE.jar >/dev/null 2>&1 &

2、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-auth-1.0.0.RELEASE.jar >/dev/null 2>&1 &

3、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-file-1.0.0.RELEASE.jar >/dev/null 2>&1 &

4、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-gen-1.0.0.RELEASE.jar >/dev/null 2>&1 &

5、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-job-1.0.0.RELEASE.jar >/dev/null 2>&1 &

6、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-system-1.0.0.RELEASE.jar >/dev/null 2>&1 &

7、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-tdengine-1.0.0.RELEASE.jar >/dev/null 2>&1 &

8、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-link-1.0.0.RELEASE.jar >/dev/null 2>&1 &

9、nohup java -Xms400m -Xmx400m -Xmn150m -Xss512k -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-broker-1.0.0.RELEASE.jar >/dev/null 2>&1 &

10、nohup java -Xms400m -Xmx400m -Xmn150m -Xss512k -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-rule-1.0.0.RELEASE.jar >/dev/null 2>&1 &

11、nohup java -Xms400m -Xmx400m -Xmn150m -Xss512k -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-protocolAnalysis-1.0.0.RELEASE.jar >/dev/null 2>&1 &

12、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-visual-monitor-1.0.0.RELEASE.jar >/dev/null 2>&1 &

13、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -Dserver.port=19101 -Dcsp.sentinel.dashboard.server=localhost:19101 -Dproject.name=sentinel-dashboard -Dsentinel.dashboard.auth.username=thinglinks -Dsentinel.dashboard.auth.password=123456 -jar -Dfile.encoding=utf-8  ./sentinel-dashboard-1.8.2.jar >/dev/null 2>&1 &
JVM调优主要就是调整下面两个指标
停顿时间:  垃圾收集器做垃圾回收中断应用执行的时间。  -XX:MaxGCPauseMillis
吞吐量:垃圾收集的时间和总时间的占比:1/(1+n),吞吐量为1-1/(1+n) 。   -XX:GCTimeRatio=n


GC调优步骤
打印GC日志
-XX:+PrintGCDetails  -XX:+PrintGCTimeStamps  -XX:+PrintGCDateStamps  -Xloggc:./gc.log
Tomcat则直接加在JAVA_OPTS变量里
分析日志得到关键性指标
分析GC原因,调优JVM参数

1、Parallel Scavenge收集器(默认)
分析parallel-gc.log
调优:
第一次调优,设置Metaspace大小:增大元空间大小-XX:MetaspaceSize=64M  -XX:MaxMetaspaceSize=64M
第二次调优,增大年轻代动态扩容增量,默认是20(%),可以减少young gc:-XX:YoungGenerationSizeIncrement=30
比较下几次调优效果:
吞吐量             最大停顿	  平均停顿	Young gc 	Full gc
98.356%     120 ms   19 ms		19		2
 99.252%     20 ms	    10 ms		16		0

99.24%						17


2、配置CMS收集器
 -XX:+UseConcMarkSweepGC
分析cms-gc.log

3、配置G1收集器
-XX:+UseG1GC
分析g1-gc.log 
young GC:[GC pause (G1 Evacuation Pause) (young)
initial-mark:[GC pause (Metadata GC Threshold) (young) (initial-mark)   (参数:InitiatingHeapOccupancyPercent)
mixed GC:[GC pause (G1 Evacuation Pause) (mixed)				(参数:G1HeapWastePercent)
full GC:[Full GC (Allocation Failure)								(无可用region)
(G1内部,前面提到的混合GC是非常重要的释放内存机制,它避免了G1出现Region没有可用的情况,否则就会触发Full GC事件。
CMS、Parallel、Serial GC都需要通过Full GC去压缩老年代并在这个过程中扫描整个老年代。G1的Full GC算法和Serial GC收集器完全一致。当一个Full GC发生时,整个Java堆执行一个完整的压缩,这样确保了最大的空余内存可用。G1的Full GC是一个单线程,它可能引起一个长时间的停顿时间,G1的设计目标是减少Full GC,满足应用性能目标。)

查看发生MixedGC的阈值:jinfo -flag InitiatingHeapOccupancyPercent 进程id

调优:
第一次调优,设置Metaspace大小:增大元空间大小-XX:MetaspaceSize=64M  -XX:MaxMetaspaceSize=64M
第二次调优,添加吞吐量和停顿时间参数:-XX:GCTimeRatio=80  -XX:MaxGCPauseMillis=100   


分析工具:gceasy,GCViewer 


G1调优相关
常用参数
-XX:+UseG1GC 开启G1
-XX:G1HeapRegionSize=n,region的大小,1-32M,2048个
-XX:MaxGCPauseMillis=200 最大停顿时间
-XX:G1NewSizePercent   -XX:G1MaxNewSizePercent
-XX:G1ReservePercent=10 保留防止to space溢出()
-XX:ParallelGCThreads=n SWT线程数(停止应用程序)
-XX:ConcGCThreads=n 并发线程数=1/4*并行
最佳实践
年轻代大小:避免使用-Xmn、-XX:NewRatio等显示设置Young区大小,会覆盖暂停时间目标(常用参数3)
暂停时间目标:暂停时间不要太严苛,其吞吐量目标是90%的应用程序时间和10%的垃圾回收时间,太严苛会直接影响到吞吐量
是否需要切换到G1
50%以上的堆被存活对象占用
对象分配和晋升的速度变化非常大
垃圾回收时间特别长,超过1秒
G1调优目标
6GB以上内存
停顿时间是500ms以内
吞吐量是90%以上

GC常用参数
堆栈设置
  -Xss:每个线程的栈大小
  -Xms:初始堆大小,默认物理内存的1/64
  -Xmx:最大堆大小,默认物理内存的1/4
  -Xmn:新生代大小
  -XX:NewSize:设置新生代初始大小
  -XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。
  -XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。
 -XX:MetaspaceSize:设置元空间大小
  -XX:MaxMetaspaceSize:设置元空间最大允许大小,默认不受限制,JVM Metaspace会进行动态扩展。
垃圾回收统计信息
  -XX:+PrintGC
  -XX:+PrintGCDetails
  -XX:+PrintGCTimeStamps 
  -Xloggc:filename
收集器设置
  -XX:+UseSerialGC:设置串行收集器
  -XX:+UseParallelGC:设置并行收集器
  -XX:+UseParallelOldGC:老年代使用并行回收收集器
  -XX:+UseParNewGC:在新生代使用并行收集器
  -XX:+UseParalledlOldGC:设置并行老年代收集器
  -XX:+UseConcMarkSweepGC:设置CMS并发收集器
  -XX:+UseG1GC:设置G1收集器
  -XX:ParallelGCThreads:设置用于垃圾回收的线程数
并行收集器设置
  -XX:ParallelGCThreads:设置并行收集器收集时使用的CPU数。并行收集线程数。
  -XX:MaxGCPauseMillis:设置并行收集最大暂停时间
  -XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
  -XX:YoungGenerationSizeIncrement:年轻代gc后扩容比例,默认是20(%)
CMS收集器设置
  -XX:+UseConcMarkSweepGC:设置CMS并发收集器
  -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
  -XX:ParallelGCThreads:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。
  -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
  -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
  -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
  -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况
  -XX:ParallelCMSThreads:设定CMS的线程数量
  -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
  -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理	
G1收集器设置 
  -XX:+UseG1GC:使用G1收集器
  -XX:ParallelGCThreads:指定GC工作的线程数量
  -XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区
  -XX:GCTimeRatio:吞吐量大小,0-100的整数(默认9),值为n则系统将花费不超过1/(1+n)的时间用于垃圾收集
  -XX:MaxGCPauseMillis:目标暂停时间(默认200ms)
  -XX:G1NewSizePercent:新生代内存初始空间(默认整堆5%)
  -XX:G1MaxNewSizePercent:新生代内存最大空间
  -XX:TargetSurvivorRatio:Survivor填充容量(默认50%)
  -XX:MaxTenuringThreshold:最大任期阈值(默认15)
  -XX:InitiatingHeapOccupancyPercen:老年代占用空间超过整堆比IHOP阈值(默认45%),超过则执行混合收集
  -XX:G1HeapWastePercent:堆废物百分比(默认5%)
  -XX:G1MixedGCCountTarget:参数混合周期的最大总次数(默认8)

实战调优细节 

  • jvm内存图
Xms和-Xmx
(1)这两个参数老是搞混,特地记一下。-Xms 为JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation来指定这个比列。
(2)-Xmx 为JVM运行时可申请的最大Heap值,默认值为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation来指定这个比列。
-Xss:规定了每个线程虚拟机栈及堆栈的大小,一般情况下,256k是足够的,此配置将会影响此进程中并发线程数的大小。
-Xms:表示初始化JAVA堆的大小及该进程刚创建出来的时候,他的专属JAVA堆的大小,一旦对象容量超过了JAVA堆的初始容量,JAVA堆将会自动扩容到-Xmx大小。
-Xmx:表示java堆可以扩展到的最大值,在很多情况下,通常将-Xms和-Xmx设置成一样的,因为当堆不够用而发生扩容时,会发生内存抖动影响程序运行时的稳定性。
新生代GC(Minor GC) : 指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快。
老年代GC(Major GC/Full GC) : 指发生在老年代的GC,出现了Major GC经常会伴随至少一次的Minor GC(并非绝对),Major GC的速度一般会比Minor GC的慢10倍以上。
  • 常用参数解释
  -Xss:每个线程的栈大小;// -X stack size
  -Xms:初始堆大小,默认物理内存的1/64;//-X mound size
  -Xmx:最大堆大小,默认物理内存的1/4 ;// -X max mound size
  -Xmn:新生代大小;// -X mound newborn size
  -XX:NewSize:设置新生代初始大小
  -XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。
  -XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。
  -XX:MetaspaceSize:设置元空间大小
  -XX:MaxMetaspaceSize:设置元空间最大允许大小,默认不受限制,JVM Metaspace会进行动态扩展。
  #垃圾回收统计信息
  -XX:+PrintGC
  -XX:+PrintGCDetails
  -XX:+PrintGCTimeStamps
  -XX:+PrintGCDateStamps
  -Xloggc:filename
  • 常用命令
1 jinfo命令
  #Jinfo -flag name PID
   jinfo -flag MaxHeapSize 70740;#查看最大堆大小=268435456/1024/1024=256M
     #Jinfo -flags PID #查看jvm相关赋值信息
2 jstat #jstat命令可以查看堆内存各部分的使用量,以及加载类的数量
      Jstat -class PID 1000 10   //查看某个java进程的类装载信息,每1000ms输出一次,共10次
      Jstat -gc PID 1000 10     //查看某个java进程的垃圾信息,每1000ms输出一次,共10次
上面图参数解释
新生代相关
S0C是第一个幸存者区的大小(字节)
S1C是第二个幸存者区的大小(字节)
S0U是第一个幸存者区已使用的大小(字节)
S1U是第二个幸存者区已使用的大小(字节)
EC是Eden空间的大小(字节)
EU是Eden空间已使用大小(字节)
老年代相关
OC是老年代的大小(字节)
OU是老年代已使用的大小(字节)
方法区(元空间)相关
MC是方法区的大小
MU是方法区已使用的大小
CCSC是压缩类空间的大小
CCSU是压缩类空间已使用的大小
其他
YGC是从应用程序启动到采样时young gc的次数
YGCT是指从应用程序启动到采样时young gc消耗时间(秒)
FGC是从应用程序启动到采样时full gc的次数
FGCT是从应用程序启动到采样时的full gc的消耗时间(秒)
GCT是从应用程序启动到采样时gc的总时间
  • 常用调优工具
   1 JCONSOLE
                   Jconsole工具是jdk自带的可视化监控工具,查看java应用程序的运行概况,监控堆信息,永久区使用情况,类加载情况等
jvisualvm
    自带的,它就在你的jdk的bin目录上
   远程连接配置
启动普通的jar程序JMX端口配置:
java -Dcom.sun.management.jmxremote.port=7003 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=172.16.64.20 -jar xxx.jar
tomcat的JMX配置
JAVA_OPTS=-Dcom.sun.management.jmxremote.port=7003 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=172.16.64.20
jvisualvm远程连接服务需要在远程服务器上配置host(连接ip 主机名),并且要关闭防火墙
  检查死锁:如图
线程的五种状态
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权,
   即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
   阻塞的情况分三种:
①.等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,
   必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,
②.同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
③.其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时,
   或者I/O处理完毕时,线程重新转入就绪状态。
5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
Visual Gc查看 垃圾回收 的具体情况
打开Java VisualVm可能会出现没有Visual Gc窗口的问题,Java VisualVm默认是没有Visual Gc的需要自己安装,点击工具-->插件
如果这个页面报错: 检查代理设置或稍后重试。服务器目前可能不可用。 您可能还需要确保防火墙不会阻塞网络通信。 您的高速缓存可能已过期。请单击“检查更新”以刷新内容。
访问页面: VisualVM: Plugins Centers
下载地址
Minor GC:  回收区域只包括年轻代(Eden, From)。
Full GC:  回收区域包括整个堆区和方法区。 整个堆内存(年轻代+老年代)+园数据区
  • 垃圾收集算法
算法名称
适用场景
优点
缺点
收集器
标记清除
空间问题(标记清除后会产生大量不连续的碎片), 因而不得不再次出发GC
效率问题 遍历了两次内存空间(第一次标记,第二次清除)
老年代默认使用的是 标记-清除 算法
复制算法
此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。
需要两倍内存空间。且存活对象增多的话,Copying算法的效率会大大降低
新生代都采取复制算法
标记整理
此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
FGC,清理老年代时,期望使用标记-整理算法,
分代收集算法
分代收集算法是目前大部分JVM的垃圾收集器采用的算法。
  • 如何选择垃圾收集器
  1. 优先调整堆的大小让服务器自己来选择
  2. 如果内存小于100M,使用串行收集器
  3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择
  4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选
  5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器
 下图有连线的可以搭配使用,官方推荐使用G1,因为性能高
回收器
适用场景
jvm配置
说明
Serial/Serial Old串行收集器
针对新生代的收集器,采用的是Copying算法,Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法。它的优点是实现简单高效,但是缺点是会给用户带来停顿。 不适合多线程项目,效率低下。
-XX:+UseSerialGC 
-XX:+UseSerialOldGC
它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程
单CPU或者小内存,单机程序
ParNew收集器
-XX:UserParNewGC
多CPU,需要最大的吞吐量,如后台计算型应用
Parallel Scavenge收集器 (并行收集器)
主要是为了达到一个可控的吞吐量
-XX:+UseParallelGC( 新生代 )
-XX:+UseParallelOldGC (老生代)
是一个新生代的多线程收集器,它在回收期间不需要暂停其他用户线程,其采用的是Copying算法
关注点是吞吐量(高效率的利用 CPU
Parallel Old收集器(并行收集器)
-XX:+UseParallelOldGC
是Parallel Scavenge收集器的老年代版本,使用多线程和Mark-Compact(标记-整理)算法。
CMS(Concurrent Mark Sweep)收集器(并发收集器)
-XX:+UseConcMarkSweepGC(old) -XX:+UseParNewGC
关注点是低的停顿时间
是一种以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是Mark-Sweep(标记-清除)算法。 如果响应时间重要性大于吞吐量,并且要求服务器响应速度快, 建议使用CMS。该回收器是多线程并发,适合多核机器,在GC时,会占用较高的CPU资源。
G1收集器
主要针对配备多颗处理器及大容量内存的机器
-XX:+UseG1GC
以极高概率满足 GC 停顿时间要求的同时 , 还具备高吞吐量性能特征 . 是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器,它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型。
  • 常用垃圾回收器
  • Java8以后,永久代被元空间取代,同时元空间不像永久代一样受制于内存,元空间是基于操作系统内存的,理论上可以一直扩展内存知道操作系统的极限
GC常用参数
堆栈设置
  -Xss:每个线程的栈大小
  -Xms:初始堆大小,默认物理内存的1/64
  -Xmx:最大堆大小,默认物理内存的1/4
  -Xmn:新生代大小
  -XX:NewSize:设置新生代初始大小
  -XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。
  -XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。
  -XX:MetaspaceSize:设置元空间大小
  -XX:MaxMetaspaceSize:设置元空间最大允许大小,默认不受限制,JVM Metaspace会进行动态扩展。
垃圾回收统计信息
  -XX:+PrintGC
  -XX:+PrintGCDetails
  -XX:+PrintGCTimeStamps
  -Xloggc:filename
收集器设置
  -XX:+UseSerialGC:设置串行收集器
  -XX:+UseParallelGC:设置并行收集器
  -XX:+UseParallelOldGC:老年代使用并行回收收集器
  -XX:+UseParNewGC:在新生代使用并行收集器
  -XX:+UseParalledlOldGC:设置并行老年代收集器
  -XX:+UseConcMarkSweepGC:设置CMS并发收集器
  -XX:+UseG1GC:设置G1收集器
  -XX:ParallelGCThreads:设置用于垃圾回收的线程数
并行收集器设置
  -XX:ParallelGCThreads:设置并行收集器收集时使用的CPU数。并行收集线程数。
  -XX:MaxGCPauseMillis:设置并行收集最大暂停时间
  -XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
  -XX:YoungGenerationSizeIncrement:年轻代gc后扩容比例,默认是20(%)
CMS收集器设置
  -XX:+UseConcMarkSweepGC:设置CMS并发收集器
  -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
  -XX:ParallelGCThreads:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。
  -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
  -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
  -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
  -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况
  -XX:ParallelCMSThreads:设定CMS的线程数量
  -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
  -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
G1收集器设置
  -XX:+UseG1GC:使用G1收集器
  -XX:ParallelGCThreads:指定GC工作的线程数量
  -XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区
  -XX:GCTimeRatio:吞吐量大小,0-100的整数(默认9),值为n则系统将花费不超过1/(1+n)的时间用于垃圾收集
  -XX:MaxGCPauseMillis:目标暂停时间(默认200ms)
  -XX:G1NewSizePercent:新生代内存初始空间(默认整堆5%)
  -XX:G1MaxNewSizePercent:新生代内存最大空间
  -XX:TargetSurvivorRatio:Survivor填充容量(默认50%)
  -XX:MaxTenuringThreshold:最大任期阈值(默认15)
  -XX:InitiatingHeapOccupancyPercen:老年代占用空间超过整堆比IHOP阈值(默认45%),超过则执行混合收集
  -XX:G1HeapWastePercent:堆废物百分比(默认5%)
  -XX:G1MixedGCCountTarget:参数混合周期的最大总次数(默认8)
  • 实战调优
JVM调优主要就是调整下面两个指标
停顿时间 :   垃圾收集器做垃圾回收中断应用执行的时间。   -XX:MaxGCPauseMillis  (尽量减少minor gc/full gc的频率和持续时间)
吞吐量 :垃圾收集的时间和总时间的占比: 1/(1+n) ,吞吐量为 1-1/(1+n) 。    -XX:GCTimeRatio=n
打印GC日志
-XX:+PrintGCDetails  -XX:+PrintGCTimeStamps  -XX:+PrintGCDateStamps  -Xloggc:./gc.log
调优建议
  JVM调优没有固定的模板配置,它需要根据应用实际情况区别对待
  但是会有以下的通用建议
  a.Xms的值与Xmx的值要尽量保持一致
  在很多情况下,-Xms和-Xmx设置成一样的。这么设置,是因为当Heap不够用时,会发生内存抖动,影响程序运行稳定性
  b.最大内存设置不能超过物理内存
  机器物理内存16G,给堆分配的内存肯定不可以设置成16G或者更多。因为除了堆内存还有非堆内存,应当视具体情况合理分配内存
  c.尽量减少Minor GC/Full GC的频率以及持续的时间
  理想的结果是:YGC发生次数较少且每次时间较快&&很长时间不发生FGC
  Eden区分配空间过少,GC的频率会较高
  Eden区分配空间过多,GC的时候持续时间会较长
  尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间
  尽量不要创建过大的对象及数组
1000个线程组压力测试,当前windows配置6核16g
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xmx512M
-Xms512M
-Xloggc:./gc.log
jvm配置
gc次数
gc耗时
gc平均耗时
jmeter平均耗时
吞吐量(越高越好)
-Xmx256M
-Xms256M
42
378ms
1.3ms
2049ms
178/s
-Xmx512M
-Xms256M
24
350ms
14.58ms
1983ms
175/s
-Xmx512M
-Xms512M
19
245ms
12.89ms
1746ms
186.2/s
-Xmx768M
-Xms768M
12 
214ms
17.8ms
1981ms
71/s
结论:xmx和xms保持一致,否则内存抖动增加耗时,当前的配置xms和xmx为512最优,平均耗时较小,吞吐量最高
分析工具
gceasy(部分收费) GCViewer 
使用gceasy分析调优
测试场景一万个线程5秒内请求单个接口(当前接口查询mysql数据库量为5000的单表)
jvm参数一:
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseSerialGC
-Xmx512M
-Xms512M
-Xss256K
-Xmn192M
-XX:NewSize=192M
-XX:NewRatio=2
-XX:SurvivorRatio=8
-XX:MetaspaceSize=800M
-XX:MaxMetaspaceSize=1024M
jvm参数二:(结论:扩大了老年代内存,fullgc少了,minorgc耗时少了,但吞吐率下来了)
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseSerialGC
-Xmx512M
-Xms512M
-Xss256K
-Xmn192M
-XX:NewSize=192M
-XX:NewRatio=3  #新生代(eden + 2*servivor) 与老年代的比值, 3 代表 新生代:老年代 = 1:3
-XX:SurvivorRatio=8
-XX:MetaspaceSize=800M
-XX:MaxMetaspaceSize=1024M
jvm参数三:
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseParallelGC  #新生代
-XX:+UseParallelOldGC  #老年代
-Xmx512M
-Xms512M
-Xss256K
-Xmn192M
-XX:NewSize=192M
-XX:NewRatio=2
-XX:SurvivorRatio=8
-XX:MetaspaceSize=800M
-XX:MaxMetaspaceSize=1024M
jvm参数四:
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseConcMarkSweepGC #低的停顿时间
-XX:+UseParNewGC
-Xmx512M
-Xms512M
-Xss256K
-Xmn192M
-XX:NewSize=192M
-XX:NewRatio=2
-XX:SurvivorRatio=8
-XX:MetaspaceSize=800M
-XX:MaxMetaspaceSize=1024M
JVM参数五
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseG1GC  #以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征
-Xmx512M
-Xms512M
-Xss256K
-Xmn192M
-XX:NewSize=192M
-XX:NewRatio=2
-XX:SurvivorRatio=8
-XX:MetaspaceSize=800M
-XX:MaxMetaspaceSize=1024M
翻译
1秒560毫秒的GC暂停时间由“G1疏散暂停”事件触发。当将活动对象从一组区域复制到另一组区域时,会触发此GC。当仅复制Young生成区域时,则触发Young GC。当复制两个Young+Tenured区域时,会触发混合GC。。
解决方案:
1.过度调谐可能导致疏散失败。因此,消除所有与内存相关的属性,只保留最小和最大堆以及实际的暂停时间目标(即,仅使用-Xms、-Xmx和暂停时间目标-XX:MaxGCPauseMillis)。删除任何额外的堆大小调整,如-Xmn、-XX:NewSize、-XX:MaxNewSize、-XX:SivitorRatio等。
2.如果问题仍然存在,那么增加JVM堆大小(即-Xmx)。
3.如果你不能增加堆大小,并且你注意到标记周期开始得不够早,无法回收旧一代,那么减少-XX:启动堆占用百分比。默认值为45%。减小该值将开始标记
按照上述建议调整一下
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseG1GC
-Xmx512M
-Xms512M
-XX:MaxGCPauseMillis=100
Solution:
1. Evacuation failure might happen because of over tuning. So eliminate all the memory related properties and keep only min and max heap and a realistic pause time goal (i.e. Use only -Xms, -Xmx and a pause time goal -XX:MaxGCPauseMillis). Remove any additional heap sizing such as -Xmn, -XX:NewSize, -XX:MaxNewSize, -XX:SurvivorRatio, etc.
2. If the problem still persists then increase JVM heap size (i.e. -Xmx).
3. If you can't increase the heap size and if you notice that the marking cycle is not starting early enough to reclaim the old generation then reduce -XX:InitiatingHeapOccupancyPercent. The default value is 45%. Reducing the value will start the marking cycle earlier. On the other hand, if the marking cycle is starting early and not reclaiming, increase the -XX:InitiatingHeapOccupancyPercent threshold above the default value.
4. You can also increase the value of the '-XX:ConcGCThreads' argument to increase the number of parallel marking threads. Increasing the concurrent marking threads will make garbage collection run fast.
5. Increase the value of the '-XX:G1ReservePercent' argument. Default value is 10%. It means the G1 garbage collector will try to keep 10% of memory free always. When you try to increase this value, GC will be triggered earlier, preventing the Evacuation pauses. Note: G1 GC caps this value at 50%.
调整后jvm参数
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseG1GC
-Xmx512M
-Xms512M
-XX:MaxGCPauseMillis=100 # 最大停顿时间
-XX:InitiatingHeapOccupancyPercent=20
-XX:ConcGCThreads=6 #当前是6核cpu不能超过这个限制否则启动报错
-XX:G1ReservePercent=10 #保留防止to space溢出()
建议结果还是一样,那么增大
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseG1GC
-Xmx800M
-Xms800M
-XX:MaxGCPauseMillis=100
-XX:InitiatingHeapOccupancyPercent=20
-XX:ConcGCThreads=6
-XX:G1ReservePercent=10
You may consider setting '-XX:MaxMetaspaceSize' to a higher value. If this property is not present already please configure it. Setting these arguments to a higher value will reduce 'Metadata GC Threshold' frequency. If you still continue to see 'Metadata GC Threshold' event reported, then you need to capture heap dump from your application and analyze it. You can learn how to do heap dump analysis from  this article.
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseG1GC
-Xmx800M
-Xms800M
-XX:MaxGCPauseMillis=100
-XX:InitiatingHeapOccupancyPercent=20
-XX:ConcGCThreads=6
-XX:G1ReservePercent=10
-XX:MaxMetaspaceSize=1g
最终调试成功结果
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:./gc.log
-XX:+UseG1GC
-Xmx1g
-Xms1g
-XX:MaxGCPauseMillis=500
-XX:InitiatingHeapOccupancyPercent=10
-XX:ConcGCThreads=6
-XX:G1ReservePercent=30
-XX:MaxMetaspaceSize=5g
-XX:MaxTenuringThreshold=15
arthas
Arthas是alibaba开源的java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器
启动
java -jar arthas-boot.jar
jvm调优参数大全
参数名称
含义
默认值
 
-Xms
初始堆大小
物理内存的1/64(<1GB)
默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.
-Xmx
最大堆大小
物理内存的1/4(<1GB)
默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn
年轻代大小(1.4or lator)
 
注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。
整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.
增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-XX:NewSize
设置年轻代大小(for 1.3/1.4)
 
 
-XX:MaxNewSize
年轻代最大值(for 1.3/1.4)
 
 
-XX:PermSize
设置持久代(perm gen)初始值
物理内存的1/64
 
-XX:MaxPermSize
设置持久代最大值
物理内存的1/4
 
-Xss
每个线程的堆栈大小
 
JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。(校长)
和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"”
-Xss is translated in a VM flag named ThreadStackSize”
一般设置这个值就可以了。
-XX:ThreadStackSize
Thread Stack Size
 
(0 means use default stack size) [Sparc: 512; Solaris x86: 320 (was 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 (was 0 in 5.0 and earlier); all others 0.]
-XX:NewRatio
年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)
 
-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
-XX:SurvivorRatio
Eden区与Survivor区的大小比值
 
设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:LargePageSizeInBytes
内存页的大小不可设置过大, 会影响Perm的大小
 
=128m
-XX:+UseFastAccessorMethods
原始类型的快速优化
 
 
-XX:+DisableExplicitGC
关闭System.gc()
 
这个参数需要严格的测试
-XX:MaxTenuringThreshold
垃圾最大年龄
 
如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概率
该参数只有在串行GC时才有效.
-XX:+AggressiveOpts
加快编译
 
 
-XX:+UseBiasedLocking
锁机制的性能改善
 
 
-Xnoclassgc
禁用垃圾回收
 
 
-XX:SoftRefLRUPolicyMSPerMB
每兆堆空闲空间中SoftReference的存活时间
1s
softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap
-XX:PretenureSizeThreshold
对象超过多大是直接在旧生代分配
0
单位字节 新生代采用Parallel Scavenge GC时无效
另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象.
-XX:TLABWasteTargetPercent
TLAB占eden区的百分比
1%
 
-XX:+CollectGen0First
FullGC时是否先YGC
false
并行收集器相关参数
XX:+UseParallelGC
Full GC采用parallel MSC
(此项待验证)
 
选择垃圾收集器为并行收集器.此配置仅对年轻代有效.即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集.(此项待验证)
-XX:+UseParNewGC
设置年轻代为并行收集
 
可与CMS收集同时使用
JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值
-XX:ParallelGCThreads
并行收集器的线程数
 
此值最好配置与处理器数目相等 同样适用于CMS
-XX:+UseParallelOldGC
年老代垃圾收集方式为并行收集(Parallel Compacting)
 
这个是JAVA 6出现的参数选项
-XX:MaxGCPauseMillis
每次年轻代垃圾回收的最长时间(最大暂停时间)
 
如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值.
-XX:+UseAdaptiveSizePolicy
自动选择年轻代区大小和相应的Survivor区比例
 
设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开.
-XX:GCTimeRatio
设置垃圾回收时间占程序运行时间的百分比
 
公式为1/(1+n)
-XX:+ScavengeBeforeFullGC
Full GC前调用YGC
true
Do young generation GC prior to a full GC. (Introduced in 1.4.1.)
CMS相关参数
-XX:+UseConcMarkSweepGC
使用CMS内存收集
 
测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明.所以,此时年轻代大小最好用-Xmn设置.???
-XX:+AggressiveHeap
 
 
试图是使用大量的物理内存
长时间大内存使用的优化,能检查计算资源(内存, 处理器数量)
至少需要256MB内存
大量的CPU/内存, (在1.4.1在4CPU的机器上已经显示有提升)
-XX:CMSFullGCsBeforeCompaction
多少次后进行内存压缩
 
由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理.
-XX:+CMSParallelRemarkEnabled
降低标记停顿
 
 
-XX+UseCMSCompactAtFullCollection
在FULL GC的时候, 对年老代的压缩
 
CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。
可能会影响性能,但是可以消除碎片
-XX:+UseCMSInitiatingOccupancyOnly
使用手动定义初始化定义开始CMS收集
 
禁止hostspot自行触发CMS GC
-XX:CMSInitiatingOccupancyFraction=70
使用cms作为垃圾回收
使用70%后开始CMS收集
92
为了保证不出现promotion failed(见下面介绍)错误,该值的设置需要满足以下公式CMSInitiatingOccupancyFraction计算公式
-XX:CMSInitiatingPermOccupancyFraction
设置Perm Gen使用到达多少比率时触发
92
 
-XX:+CMSIncrementalMode
设置为增量模式
 
用于单CPU情况
-XX:+CMSClassUnloadingEnabled
 
 
辅助信息
-XX:+PrintGC
 
 
输出形式:

[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails
 
 

输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
-XX:+PrintGCTimeStamps
 
 
 
-XX:+PrintGC:PrintGCTimeStamps
 
 
可与-XX:+PrintGC -XX:+PrintGCDetails混合使用
输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
-XX:+PrintGCApplicationStoppedTime
打印垃圾回收期间程序暂停的时间.可与上面混合使用
 
输出形式:Total time for which application threads were stopped: 0.0468229 seconds
-XX:+PrintGCApplicationConcurrentTime
打印每次垃圾回收前,程序未中断的执行时间.可与上面混合使用
 
输出形式:Application time: 0.5291524 seconds
-XX:+PrintHeapAtGC
打印GC前后的详细堆栈信息
 
 
-Xloggc:filename
把相关日志信息记录到文件以便分析.
与上面几个配合使用
 
 
-XX:+PrintClassHistogram
garbage collects before printing the histogram.
 
 
-XX:+PrintTLAB
查看TLAB空间的使用情况
 
XX:+PrintTenuringDistribution
查看每次minor GC后新的存活周期的阈值
 

Desired survivor size 1048576 bytes, new threshold 7 (max 15)
new threshold 7即标识新的存活周期的阈值为7。
压力测试工具jmeter
* 样本:请求的次数,计算公式是线程数*循环次数,如果线程组配置勾选了永远,那么就是你停止测试时实际发送的请求数
* 平均值:响应时间的平均用时,单位是毫秒。比如这里的平均响应时间是38毫秒
* 中位数:响应时间的中位数,单位是毫秒。
* 90%百分位:90%的响应时间小于该数值,单位是毫秒。这里有90%的响应时间小于22毫秒
* 95%百分位:含义和90%类似
* 99%百分位:含义和90%类似
* 最小值:本轮测试最小响应时间,单位是毫秒。
* 最大值:本轮测试最大响应时间,单位是毫秒。
* 异常%:本轮测试出现异常的请求比例。
* 吞吐量:可以理解为QPS,即是我们测试的接口处理请求的能力。比如这里是平均每秒可以处理2.2次请求
* 接收KB/Sec:响应数据的接收速率
* 发送KB/Sec:请求数据的发送速率
此压力测试windows本地测试配置参数如下
0 不经过数据库
  通过redis返回
1 单表
   1.1 数据量5千
网络层面并发数和吞吐量的关系:
并发数x包长度=吞吐量
服务器及业务上的并发数、吞吐量
QPS(TPS)= 并发数/平均响应时间
并发数高,吞吐量是否必然高?
个人觉得不一定。
如果谈的是网络设备,参照:并发数x包长度=吞吐量,吞吐量依赖于并发数和包长度。
如果谈的是服务器及完整整体性能,需要明确吞吐量的度量指标,假定以吞吐量以QPS作为度量指标,如果并发数高,但平均响应时间上不去,则QPS并不一定高。
mysql连接数
   
#连接池初始建立的连接数,默认0
initialSize: 0
#连接池中保持的最小连接数,默认1
minIdle: 1
#连接池中最大允许的连接数,默认8
maxActive: 8
#获取连接的最大等待时间,超时将抛出异常
maxWait: 60000
#连接池是否预处理语句,是否开启预处理语句,可以提高数据库访问效率;默认false
poolPreparedStatements: false
线程组
几秒内/s
循环次数
平均响应时间/ms
最大响应时间/ms
吞吐量/QPS/s
QPS(TPS)= 并发数/平均响应时间
异常%
并发( 并发数x包长度=吞吐量)
数据量
500
5
1
4
15
100
0
0.4
5000
1000
5
1
4
18
199
0
0.7
5000
2000
5
1
4
36
330
0
1.32
5000
3000
5
1
4
54
482
0
1.9
5000
4000
5
1
526
3508
715
0
376
5000
5000
5
1
582
3185
693
0
403
5000
6000
5
1
1122
5592
678.9
0
671
5000
7000
5
1
862
4643
695.1
0
597
5000
8000
5
1
989
6039
678.9
0
670
5000
10000
5
1
1342
6996
662
0
888
5000
15000
5
1
1551
6541
1234.2
99.51
1912.7
20000
5
1
1864
5176
902
99.73
1681
5000
30000
5
1
2754
13951
793
46.65
792
5000
50000
5
1
480
5022
1100.1
64.84
528
5000
100000
5
1
1688
21314
996
83.92
1681
5000
#连接池初始建立的连接数,默认0
initial-size: 5
#连接池中保持的最小连接数,默认1
min-idle: 5
#连接池中最大允许的连接数,默认8
max-active: 20
#获取连接的最大等待时间,超时将抛出异常
max-wait: 60000
#连接池是否预处理语句,是否开启预处理语句,可以提高数据库访问效率;默认false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
线程组
几秒内/s
循环次数
平均响应时间/ms
最大响应时间/ms
吞吐量/QPS/s
QPS(TPS)= 并发数/平均响应时间
异常%
并发( 并发数x包长度=吞吐量)
数据量
500
5
1
4
20
99
0
0.4
5000
1000
5
1
7
143
200
0
1.4
5000
2000
5
1
5
65
330
0
1.65
5000
3000
5
1
6
96
486
0
2.92
5000
4000
5
1
315
1775
687
0
206
5000
10000
5
1
6673
12136
446
0
2943
5000
11000
5
1
7069
16594
561
16
3927
5000
12000
5
1
5782
15067
568
10
3237
5000
15000
5
1
4545
13527
666
20
2997
5000
20000
5
1
5230
17952
545
19.9
2834
5000
50000
5
1
626
6773
1078
80.44
668
5000
结论:当数据配置参数调优max-active: 20,出错率比较默认配置好点,平均响应时间比默认少2.8倍,默认最优是5s内10000个用户访问平均响应时间1.3秒不出错,超过就会出错, 
     优化后的也在1万左右,在不出错的情况下并发量大概在888
jvm调优:模拟1000次请求一个线程串行回收器
-XX:+PrintGCDetails
-Xmx500M
-Xms500M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=500M
-XX:+PrintGCDetails
-Xmx500M
-Xms250M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=500M
结论: 这个也说明了之前一直强调的初始堆内存大小要与最大内存大小一致,否则就会频繁的触发GC回收,
垃圾回收次数以及吞吐量,与最大堆内存大小无关,只和初始堆内存大小有关 堆的初始内存一定要和最大内存一致,并且堆的初始值越大,吞吐量越大
#打印gc信息
-XX:+PrintGCDetails
#打印内测溢出错误信息
-XX:+HeapDumpOnOutOfMemoryError
   1.2 数据量10万
   1.3 数据量50万
   1.4 数据量100万
   1.5 数据量200万
   1.6 数据量500万
   1.7 数据量1000万
2 两表联查
   2.1 数据量5千
   2.2 数据量10万
   2.3 数据量50万
   2.4 数据量100万
   2.5 数据量200万
   2.6 数据量500万
   2.7 数据量1000万
3 三表联查
   3.1 数据量5千
   3.2 数据量10万
   3.3 数据量50万
   3.4 数据量100万
   3.5 数据量200万
   3.6 数据量500万
   3.7 数据量1000万
4四表联查
   4.1 数据量5千
   4.2 数据量10万
   4.3 数据量50万
   4.4 数据量100万
   4.5 数据量200万
   4.6 数据量500万
   4.7 数据量1000万
5五表联查
   5.1 数据量5千
   5.2 数据量10万
   5.3 数据量50万
   5.4 数据量100万
   5.5 数据量200万
   5.6 数据量500万
   5.7 数据量1000万

1、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-gateway-1.0.0.RELEASE.jar >/dev/null 2>&1 &

2、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-auth-1.0.0.RELEASE.jar >/dev/null 2>&1 &

3、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-file-1.0.0.RELEASE.jar >/dev/null 2>&1 &

4、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-gen-1.0.0.RELEASE.jar >/dev/null 2>&1 &

5、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-job-1.0.0.RELEASE.jar >/dev/null 2>&1 &

6、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-system-1.0.0.RELEASE.jar >/dev/null 2>&1 &

7、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-tdengine-1.0.0.RELEASE.jar >/dev/null 2>&1 &

8、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-link-1.0.0.RELEASE.jar >/dev/null 2>&1 &

9、nohup java -Xms400m -Xmx400m -Xmn150m -Xss512k -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-broker-1.0.0.RELEASE.jar >/dev/null 2>&1 &

10、nohup java -Xms400m -Xmx400m -Xmn150m -Xss512k -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-rule-1.0.0.RELEASE.jar >/dev/null 2>&1 &

11、nohup java -Xms400m -Xmx400m -Xmn150m -Xss512k -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -server -jar -Dfile.encoding=utf-8  ./thinglinks-modules-protocolAnalysis-1.0.0.RELEASE.jar >/dev/null 2>&1 &

12、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -jar -Dfile.encoding=utf-8  ./thinglinks-visual-monitor-1.0.0.RELEASE.jar >/dev/null 2>&1 &

13、nohup java -Xms150m -Xmx150m -Xmn100m -Xss512k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -server -Dserver.port=19101 -Dcsp.sentinel.dashboard.server=localhost:19101 -Dproject.name=sentinel-dashboard -Dsentinel.dashboard.auth.username=thinglinks -Dsentinel.dashboard.auth.password=123456 -jar -Dfile.encoding=utf-8  ./sentinel-dashboard-1.8.2.jar >/dev/null 2>&1 &

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BACKWASH2038

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值