67-阶段性复习:JVM性能优化到底该怎么做?


1、一个新系统开发完毕之后如何设置JVM参数?

首先大家应该估算一下自己负责的系统每个核心接口每秒多少次请求,每次请求会创建多少个对象,每个对象大概多大,每秒钟会使用多少内存空间.

然后就可以估算出来多长时间会发生一次Young GC,而且可以估算一下发生Young GC的时候,会有多少对象存活下来,会有多少对象升入老年代里,老年代对象增长的速率大概是多少,多久之后会触发一次Full GC.

总结:总体原则就是让每次young gc后的存活对象远远小于servior区,避免对象频繁进入老年代触发full gc。最理想的状态就是系统几乎不发生full gc,老年代稳定占用一定内存空间,同时就是几分钟发生一次young gc,每次几毫秒.

2、在压测之后合理调整JVM参数

用jstat等工具去观察JVM的运行内存模型,分析如下参数:
Eden区的对象增长速率多块?
Young GC频率多高?
一次Young GC多长耗时?
Young GC过后多少对象存活?
老年代的对象增长速率多高?
Full GC频率多高?
一次Full GC耗时?

通过jstat分析出来系统的JVM运行指标,找到Full GC的核心问题,然后优化一下JVM的参数,尽量让对象别进入老年代,减少Full GC的频率.

3、线上频繁Full GC的几种表现

机器CPU负载过高;
频繁Full GC报警;
系统无法处理请求或者处理过慢

4、频繁Full GC的几种常见原因

  1. 内存分配不合理,Survivor区域过小,导致对象频繁进入老年代,频繁触发Full GC
  2. 系统一次性加载过多数据进内存,搞出来很多大对象,导致频繁有大对象进入老年代,必然频繁触发Full GC
  3. 系统发生了内存泄漏,莫名其妙创建大量的对象,始终无法回收
  4. Metaspace(永久代)因为加载类过多触发Full GC
  5. 误调用System.gc()触发Full GC

5、总结

可以根据自己公司的业务情况合理制定jvm参数模板,需要注意 内存区域的分配,垃圾回收器的指定,CMS性能优化的一些参数(比如压缩、并发,等等),常见的一些参数,包括禁止System.gc(),打印出来GC日志

猜你喜欢

转载自blog.csdn.net/m0_37900506/article/details/114042725
今日推荐