问题一:报表系统为什么会频繁发生内存溢出?
报表系统为什么会频繁发生内存溢出?
参考回答:
报表系统频繁发生内存溢出主要是因为JVM资源分配不足。在高峰期间,接口A每次进行报表计算时都需要使用大量的内存,并且这些数据会在内存中驻留很长时间。由于我们分配给JVM的内存只有3GB,当多人同时访问这些接口时,内存就不够用了,从而导致了内存溢出(OOM)。
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/627361
问题二:升级机器配置后,为什么会出现频繁的GC问题和超长的GC时间?
升级机器配置后,为什么会出现频繁的GC问题和超长的GC时间?
参考回答:
升级机器配置后,虽然OOM问题得到了解决,但是由于报表系统中的对象存活时间较长,不能仅仅通过增加年轻代来解决。增加年轻代大小会减少老年代的大小,由于CMS的碎片和浮动垃圾问题,可用的空间就更少了。这导致了频繁的GC问题和超长的GC时间。
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/627362
问题三:如何通过调整JVM参数来优化GC性能?
如何通过调整JVM参数来优化GC性能?
参考回答:
我们可以通过几个步骤来优化GC性能。首先,可以调整MaxTenuringThreshold参数,让年轻代的对象更快地晋升到老年代。其次,开启CMSScavengeBeforeRemark参数,使得在CMS remark前,先执行一次Minor GC将新生代清掉。最后,加入ParallelRefProcEnabled参数来并行处理Reference,以加快处理速度,缩短耗时。
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/627363
问题四:为什么在改用高性能机器后,MinorGC时长会变得不可控?
为什么在改用高性能机器后,MinorGC时长会变得不可控?
参考回答:
在改用高性能机器后,由于堆空间明显加大,造成了回收时间加长。高性能机器带来了非常大的服务吞吐量,年轻代的分配速率明显提高,这导致MinorGC的时长变得不可控,有时候会超过1秒。
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/627366
问题五:如何通过代码优化来减少内存占用和提高系统性能?
如何通过代码优化来减少内存占用和提高系统性能?
参考回答:
可以通过MAT分析堆快照,应该可以发现很多可以通过代码优化的地方。首先,进行select *全量排查,只允许获取必须的数据,以减少不必要的数据加载。其次,查看可能会发现报表系统中cache实际的命中率并不高,因此将Guava的Cache引用级别改成弱引用(WeakKeys),以减少内存的占用。最后,限制报表导入文件的大小,并拆分用户超大范围的查询导出请求,以降低单次操作的内存需求。这些优化措施显著地减少了内存占用并提高了系统性能。
关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/627367