一、压测概念
压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都是为了系统在线上的处理能力和稳定性能够在一个标准范围内,做到心中有数。
使用压力测试,我们希望找到很多种用其它测试方法更难发现的错误。有两种错误类型是:内存泄漏,并发与同步。
有效的压力测试系统将应用以下这些关键条件:重复,并发,量级,随机变化。
影响性能考虑点包括:
数据库、应用程序、中间件(tomcat、Nginx)、网络和操作系统等方面。
首先要考虑自己的应用属于CPU密集型还是IO密集型。
二、压测软件
1、Jmeter
官网
下载到本地,然后解压。
进入解压目录/bin/,如果是Windows系统,则直接点击 jmeter.bat启动即可。
三、堆内存与垃圾回收
1、jvm内存模型
堆
所有的对象实例以及数组都要在堆上分配,堆是垃圾收集器管理的主要区域,也被称为“GC对”;也是我们优化最多考虑的地方。
堆可以细分为:
-
新生代
* Eden空间(伊甸园区)
* From Survivor空间(幸存者区)
* To Survivor空间 - 老年区
- 永久代/元空间
JAVA堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
可通过参数 -Xmx -Xms 来指定运行时堆内存的大小,堆内存空间不足也会抛OutOfMemoryError异常。
GC垃圾回收流程:
新创建来的对象,如果在Edan可以放的下就放,如果放不下,则GC一次,看能不能放的下,如果放的下就放,如果是一个大对象,在伊甸园区(新生代)放不下,则会放入到老年代(在新生代没法处理的情况下才进入到老年代),如果老年代能够放的下则会分配内存,如果老年代还放不下(不管进入到哪个内存区域里,都要判断是否放的下),则会进行一次 FULL GC(全面GC),即大*,会将新生代和老年代存放的数据进行判断,如果没用则会踢出去,再来看是否还放的下,如果老年代还是放不下,则会报内存溢出异常(out of memory)。所以,FULL GC 也能清理一些空间。
大家注意,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慢的多。
性能监控-jvisualvm 的使用
一、jvisualvm
Jdk的两个小工具 jconsole、jvisualvm(升级版的 jconsole);通过命令行启动,可监控本地和远程应用。远程应用需要配置。
jvisualvm 能干什么?
监控内存泄漏,跟踪垃圾回收,执行时内存、CPU分析、线程分析…
idea集成
1.安装VisualVM插件 VisualVM
2.安装后,重启Idea
3.安装完成后,在原来的Run和Debug按纽旁会多出两个按纽,点击后会出现选择VisualVM路径,选择本地JDK安装目录下的bin目录中的jvisualvm即可。
线程监视名词解释:
运行:正在运行的
休眠:sleep
等待:wait
驻留:线程池里面的空闲线程
监视:阻塞的线程,正在等待锁
安装插件方便查看gc: