JVM 调优

场景

调优Eden内存大小

  • 内存太大 STW太久。内存太小回收太平凡。

    考虑吞吐量与STW的平衡

调优Survivor

  • 对象在Survivor中待不到足够的时间。或者某些对象直接晋升到Old
  • 同一个年龄的某个对象超过仓库的一半大小则晋升到老年代。

Metaspace 导致 FullGC

关键调优参数

  • Used 已用空间大小
  • capacity 当前已使用且未分配的大小
  • committed 当前已分配的空间大小
  • reserved 预留空间大小

image-20220516215727652

这个例子中发生了FULL GC 实际使用35MB 但占用空间 56MB。这里可能出现了碎片。

通过Dump文件看是不是存在很多某走类加载器。

在反射实实际上会出现new一个ClassFileAssenbler

这里会创建一个ClassFile

调用次数超过15次之后会创建一个DelegatingClassLoader 来加载这个ClassFile

并且这个DelegatingClassLoader 会作为软引用被创建。所以即便进行FullGC 也需要两次。

解决办法
  • 适当的调高matespace空间大小

  • 优化不合理的反射调用,列入常见属性的拷贝工具Bean Utils.copyProperties

    可以使用mapstruct 替换

JVM 调优用到的参数

image-20220516205325857