gpt4 book ai didi

java - 如何为长生命周期对象优化 Java gc

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:46 25 4
gpt4 key购买 nike

我的 Java 应用程序维护着一个可以增长到 10 GB 的内部缓存。过期策略设置为 30 分钟或达到内存阈值时(我正在使用本地 ehcache)。很明显,在 30 分钟后,所有缓存的对象都将在旧的 gen 中,并且需要完整的 gc 来收集它们。至于现在停止世界暂停可以达到 6 秒,我想减少它。

平均对象大小为 500k,但最多可达 1 兆,因此我们谈论的是 10000-20000 个缓存对象(实际上是字节数组)。

GC 优化的最佳策略是什么?我知道我可以脱离堆,但这是最后的解决方案。

谢谢!

最佳答案

10GB 缓存不是你应该在堆中做的事情。使用 ByteBuffers用于缓存。对象创建不应该那么昂贵。这样就不会涉及 GC,您可以自己管理所有内容。

例如,如果您在 Java 数据库管理系统中实现页面缓存,您不会为其创建对象,而是使用字节缓冲区或托管字节缓冲区或最佳直接字节缓冲区。您可以了解有关这三个的更多信息 here .

如果您一次处理更多对象,比如说一百万个对象,您将看到 GC 时间份额增加。我看到我们管理大量节点进行数据处理的情况,而且速度非常慢。然后我们切换到直接字节缓冲区方案,甚至使用了一些额外的技术,我们能够在其中容纳更多数据(每个对象至少花费 24 字节)并且不再首先考虑对象。最后我们处理的是数据而不是对象。这将性能提高了许多倍,我们能够处理比预期更多的数据。

在那之后我们注意到它都适合一个数据库,这就是我们抓取所有内容的重点。

所以看看直接缓冲区可以为您做什么。

关于java - 如何为长生命周期对象优化 Java gc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19232245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com