[redisson]集群模式运行一段时间会出现OutOfMemory

2024-07-18 635 views
0

长时间运行,导致内存泄露

1.从spring官网上生成spring boot的demo项目。 2.在pom.xml中增加对redisson的依赖。

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.11.3</version>
</dependency>

3.debug方式启动spring boot。 4.通过断点观察 redisson-oom

可以看到redisson所依赖的netty里,这个数组的的大小会不断增大,最终导致oom。

Redis version
redis_version:5.0.4
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:913214bd6b0ee4ea
redis_mode:cluster
os:Linux 3.10.0-957.1.3.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
Redisson version

3.11.3

Redisson configuration

我是在spring boot里通过代码的方式配置的。

@SpringBootApplication
public class Test3Application {

    public static void main(String[] args) {
        SpringApplication.run(Test3Application.class, args);
    }

    @Bean
    public RedissonClient getRedisson() {
        Config config = new Config();
        config.useClusterServers()
                .setScanInterval(2000) // cluster state scan interval in milliseconds
                .addNodeAddress("redis://10.193.xxx.xxx:8303");
        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }

}

回答

1

您能提供内存转储吗?哪个对象导致内存不足?

7

类:io.netty.util.interna.UnpaddedInternalThreadLocalMap 字段:Object[] indexedVariables; redisson-netty-01 redisson-netty-02

这些信息是否足够?

3

我不知道 InternalThreadLocalMap 中的哪个对象消耗了内存?你能分享一下转储吗?

5

你的 classpath 中有哪个 netty 版本?

6

您可以从这里下载转储

UnpaddedInternalThreadLocalMap是InternalThreadLocalMap的父类,indexedVariables定义在UnpaddedInternalThreadLocalMap中。

classpath 中的 netty 版本是:4.1.39

2

我看到您的应用程序中有 ActiveMQ、Hibernate。您可以使用纯代码运行测试吗?我无法重现该问题。

9

你运行了哪些代码来获取此信息?在你的示例中,我确实只看到带有 Redisson 的 Spring boot 配置

2

图像 只需启动此类即可启动该应用程序。

7

无法在本地重现

6

无法启动应用程序?还是有其他原因?

8

@songjiesdnu

我启动它,看到大约 100 个 FastThreadLocalThread 对象实例。应用程序总共消耗了 55Mb

7

@mrniko 如果你运行应用一段时间,你会发现 FastThreadLocalThread 对象的数量会增长。在我们的生产环境中,大约需要 10 天才会发生 oom。

4

您是否尝试过使用其他编解码器?

8

我还没有尝试其他编解码器。你推荐哪个编解码器?

1

@songjiesdnu

我也遇到了这个问题,最新版本的redisson和spring-boot,你解决了吗

我发现FastThreadLocal.detory()可以删除对象,定时调用应该可以解决oom的问题

6

@zanglei-1987 我最近修改了一版redisson的源码,将CommandDecoder对FastTheadLocal的使用改为JDK自带的ThreadLocal,然后在decode方法结束之后调用ThreadLocal的remove方法。我心脏病还需要观察一段时间,才能确定是否真正解决了该问题。但是从dump出来的堆看,已经不存在该问题了。

4

这个你可以试试,从源代码看,其并不会清理Objcet[]内存。

1

固定的!

8

@mrniko 我在 mvn 存储库中找不到 3.11.4,你什么时候上传它?