JVM 调优
JVM 调优
场景
调优Eden内存大小
内存太大 STW太久。内存太小回收太平凡。
考虑吞吐量与STW的平衡
调优Survivor
- 对象在Survivor中待不到足够的时间。或者某些对象直接晋升到Old
- 同一个年龄的某个对象超过仓库的一半大小则晋升到老年代。
Metaspace 导致 FullGC
关键调优参数
- Used 已用空间大小
- capacity 当前已使用且未分配的大小
- committed 当前已分配的空间大小
- reserved 预留空间大小
这个例子中发生了FULL GC 实际使用35MB 但占用空间 56MB。这里可能出现了碎片。
通过Dump文件看是不是存在很多某走类加载器。
在反射实实际上会出现new一个ClassFileAssenbler
这里会创建一个ClassFile
调用次数超过15次之后会创建一个DelegatingClassLoader 来加载这个ClassFile
并且这个DelegatingClassLoader 会作为软引用被创建。所以即便进行FullGC 也需要两次。
解决办法
适当的调高matespace空间大小
优化不合理的反射调用,列入常见属性的拷贝工具Bean Utils.copyProperties
可以使用mapstruct 替换
JVM 调优用到的参数
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment