最近,我开发的应用程序开始使用比平常更多的内存。它是一个独立的Jersey REST webapp,可以运行定期的数据处理工作。我担心我正在处理的数据大小突然飙升,所以我进行了一次堆转储,把它扔进Eclipse MAT,得到了这些结果:
所有内存都由PooledMemoryManager
以byte[]
s的形式使用。当我检查这些字节时,它们绝大多数看起来都包含HTTP请求和响应的文本:
我希望应用程序能够对每个请求进行大量记录,大约每30秒一次,因为我的监控服务会ping其healthcheck端点。但是,有大约30,000个这些字符串存储在4KB块中,但尚未被释放,因为oldgen空间开始运行不足并且我的应用程序崩溃。
我无法解释这种行为;它在我最近的部署后大约一周开始发生,但是只需要大约一天的时间来消耗整个堆,而且我在过去几个月中部署的代码都没有在触摸Jersey或Grizzly代码。
有没有人见过这样的事情?