减少延迟对java开发人员来说是一个新的挑战,所以我们需要最佳的工具来解决它。有许多可用的工具,既有开源的也有付费的。
在本文中,介绍与大型生产应用程序的内存分析相关的挑战,以及如何克服这些挑战。
挑战
1.大型应用程序的JVM堆内存占用相当大,分析如此大的堆转储需要大量内存来运行分析器工具,并且在普通的笔记本电脑上通常很慢。
2.大型堆转储消耗等量的磁盘空间。如果没有足够的磁盘,堆转储命令将失败,或者在最坏的情况下,填满根分区并使运行它的主机崩溃。
3.堆转储是一个世界末日事件。进行堆转储会暂停应用程序中的所有活动,这可能导致服务的运行状况检查失败,并可能导致服务被终止,从而难以获取堆转储文件。
解决办法
1.在大型堆转储的情况下,最好使用像AWS EC2这样的具有足够内存和磁盘空间的基于云的资源。
2.为了解决磁盘空间问题,如果应用程序运行在一些云资源上,那么它通常有单独的存储附加到它。在进行堆转储之前,可以增加单独的存储。
3.检查是否使用定期运行状况检查来监控应用程序,例如,它是否是负载平衡器的一部分。在这种情况下,需要将它从服务机队中取出,以避免在堆转储命令启动后被终止。
4.以一定的时间间隔获取多个堆转储,以捕获服务状态的变化。
改进
1.最大的元凶之一是内存中的缓存,这导致了过多的保留堆,从而导致频繁的垃圾收集和延迟影响。
2.内存分析给出了一个主要的线索,关于用于数据检索的数据索引是如何被使用的。结果是,完整的索引被装载在JVM堆中,也存储在tmpfs上,因此使用了两倍的所需内存,这是不必要的,还会导致频繁的垃圾收集。
结论
分析任何大规模生产应用程序的内存都是至关重要的。在应用程序中缓存数据可能是有用的,但是应该密切监视,以监视随着时间的推移是否有任何降级。
堆转储分析是一个强大的工具。如果使用正确的机器和工具,它会变得很痛苦。注意生产应用程序的运行状况检查例程,同时采用堆转储来成功收集这些例程。