前言
影响性能考虑点包括:数据库、应用程序、中间件(tomcat\Ngninx)、网络(带宽)、操作系统
首先考虑自己的应用属于CPU密集型(计算、排序、整合)还是IO密集型(网络传输数据、磁盘读写、数据库读数据、redis缓存读数据)
一、性能优化方法
CPU密集型:增加cpu
IO密集型:增加固态、加内存条、使用各种缓存技术提高网卡的传输效率
二、性能监控
1)jvm内存模型
2)堆
所有的对象实例以及数组都要在堆上分配,堆是垃圾收集器管理的主要区域,也被称为“GC堆”;也是我们优化最多考虑的地方
堆可以细分为:
新生代
- Eden空间(伊甸园区)
- From Survivor空间(幸存者区)
- To Survivor空间
老年区
永久代/元空间
JAVA堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
可通过参数 -Xmx -Xms 来指定运行时堆内存的大小,堆内存空间不足也会抛OutOfMemoryError异常
下图为堆垃圾回收机制
新创建来的对象,如果在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慢的多。
工具jconsole与jvisualvm
Jdk的两个小工具 jconsole、jvisualvm(升级版的 jconsole);通过命令行启动,可监控本地和远程应用。远程应用需要配置。
安装jdk1.8后,在终端输入 jconsole
192:~ yingyan$ jconsole
连接后显示,注意以下指标
jvisualvm
jvisualvm 能干什么?
监控内存泄漏,跟踪垃圾回收,执行时内存、CPU分析、线程分析…
192:~ yingyan$ jvisualvm
2023-03-02 10:31:21.937 java[53165:5187371] *** WARNING: Textured window <AWTWindow_Normal: 0x7ffe5a3a1c70> is getting an implicitly transparent titlebar. This will break when linking against newer SDKs. Use NSWindow's -titlebarAppearsTransparent=YES instead.
线程监视名词解释:
运行:正在运行的
休眠:sleep
等待:wait
驻留:线程池里面的空闲线程
监视:阻塞的线程,正在等待锁
无法查看监控数据,需要安装插件
https://visualvm.github.io/pluginscenters.html
https://visualvm.github.io/uc/8u131/updates.xml.gz
安装GC插件
退出,重启jvisualvm
192:~ yingyan$ jvisualvm
2023-03-02 10:31:21.937 java[53165:5187371] *** WARNING: Textured window <AWTWindow_Normal: 0x7ffe5a3a1c70> is getting an implicitly transparent titlebar. This will break when linking against newer SDKs. Use NSWindow's -titlebarAppearsTransparent=YES instead.
2023-03-02 10:49:27.752 java[53165:5187371] TSM AdjustCapsLockLEDForKeyTransitionHandling - _ISSetPhysicalKeyboardCapsLockLED Inhibit
192:~ yingyan$ jvisualvm
2023-03-02 10:58:59.337 java[55834:5219453] *** WARNING: Textured window <AWTWindow_Normal: 0x7f9f90813340> is getting an implicitly transparent titlebar. This will break when linking against newer SDKs. Use NSWindow's -titlebarAppearsTransparent=YES instead.
压力测试需要关注
监视中的cpu、堆、线程、gc