谷粒商城-高级-44 性能测试-压力测试

一、压测概念

压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都是为了系统在线上的处理能力和稳定性能够在一个标准范围内,做到心中有数。

使用压力测试,我们希望找到很多种用其它测试方法更难发现的错误。有两种错误类型是:内存泄漏,并发与同步

有效的压力测试系统将应用以下这些关键条件:重复,并发,量级,随机变化。

影响性能考虑点包括:
数据库、应用程序、中间件(tomcat、Nginx)、网络和操作系统等方面。

首先要考虑自己的应用属于CPU密集型还是IO密集型

二、压测软件

1、Jmeter

Jmeter官网

进入到下载页面,下载Java8版本的:
file

下载到本地,然后解压。
进入解压目录/bin/,如果是Windows系统,则直接点击 jmeter.bat启动即可。
Mac用户,需要执行sh命令启动:

➜  cd /Users/kaiyiwang/javaweb/guli/other/test/apache-jmeter-5.3/bin/
➜  sh jmeter

命令行出现

 ================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
   jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
   Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================

然后会 弹出下面的jmeter界面 :
file

在测试时,需要进行分组测试,Jmeter还是非常强大的,有丰富的图表和测试指标可以参考。

三、堆内存与垃圾回收

1、jvm内存模型

file

所有的对象实例以及数组都要在堆上分配,堆是垃圾收集器管理的主要区域,也被称为“GC对”;也是我们优化最多考虑的地方。

file

堆可以细分为:

  • 新生代
    • Eden空间(伊甸园区)
    • From Survivor空间(幸存者区)
    • To Survivor空间
  • 老年区
  • 永久代/元空间

JAVA堆的分类:
从内存回收的角度上看,可分为新生代(Eden空间,From Survivor空间、To Survivor空间)及老年代(Tenured Gen)。

从内存分配的角度上看,为了解决分配内存时的线程安全性问题,线程共享的JAVA堆中可能划分出多个线程私有的分配缓冲区(TLAB)。

JAVA堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
可通过参数 -Xmx -Xms 来指定运行时堆内存的大小,堆内存空间不足也会抛OutOfMemoryError异常。

GC垃圾回收流程:
file

新创建来的对象,如果在Edan可以放的下就放,如果放不下,则GC一次,看能不能放的下,如果放的下就放,如果是一个大对象,在伊甸园区(新生代)放不下,则会放入到老年代(在新生代没法处理的情况下才进入到老年代),如果老年代能够放的下则会分配内存,如果老年代还放不下(不管进入到哪个内存区域里,都要判断是否放的下),则会进行一次 FULL GC(全面GC),即大屠杀,会将新生代和老年代存放的数据进行判断,如果没用则会踢出去,再来看是否还放的下,如果老年代还是放不下,则会报内存溢出异常(out of memory)。所以,FULL GC 也能清理一些空间。

file

大家注意,FULL GC 非常慢,如果 MinorGC 100次才花费1秒时间,FULL GC 不到10次就得要花费1秒钟,所以,这是一个性能慢10倍的GC,后来优化监控的时候,一定要避免我们的应用经常性发生FULL GC的问题

每次GC表示增长一岁,如果有些对象存活超过阀值,则会搬到老年代,老年代存放的是生命力持久的和大对象。

一次小的 MinorGC 会将我们的伊甸园区清理干净,如果能放到幸存者区则放到幸存者区,如果不能则放到放到老年代,老年代放不下,则会FULL GC。

YGC(Young GC) FGC(Full GC )

FGC 要比YGC慢的多。

jvisual:
file


相关文章:
JVM内存模型——JAVA的根基
深入理解JVM-内存模型(jmm)和GC

为者常成,行者常至