[英]How to optimize Java gc for long living objects
我的Java应用程序维护一个内部缓存,可以增长到10演出。 到期策略设置为30分钟或达到内存阈值时(我正在使用本地ehcache)。 很明显,在30分钟之后,所有缓存的对象都将在旧版本中,并且需要一个完整的gc来收集它们。 至于现在停止世界暂停可能达到6秒,我想减少它。
平均对象大小为500k,但最高可达1mcg,因此我们讨论的是10000-20000个缓存对象(实际上是字节数组)。
GC优化的最佳策略是什么? 我知道我可以脱离堆,但它是最后的解决方案。
谢谢!
10GB缓存不是你应该在堆中做的事情。 使用ByteBuffers进行缓存。 对象创建不应该那么昂贵。 这种方式不涉及GC,您可以自己管理所有内容。
例如,如果在Java数据库管理系统中实现页面缓存,则不会为其创建对象,而是使用字节缓冲区或托管字节缓冲区或最佳直接字节缓冲区。 你可以在这里了解更多关于这三个。
如果您处理更多,那么让我们一次说出一百万个对象,您会看到GC时间份额上升。 我看到我们管理大量节点进行数据处理的情况,而且非常慢。 然后,我们切换到直接字节缓冲区方案,甚至使用了一些额外的技术,我们能够容纳更多的数据(对象至少每个成本为24字节)并且不再考虑对象。 最后我们处理数据而不是对象。 这使性能提高了很多倍,我们能够处理比预期更多的数据。
在那之后我们注意到这一切都适合数据库,这就是我们抓住一切的重点。
因此,请查看直接缓冲区可以为您做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.