spring-cloud-alibaba icon indicating copy to clipboard operation
spring-cloud-alibaba copied to clipboard

当spring 容器刷新 重复创建NacosNamingService客户端,线程多达上万引起OOM

Open Master-Jack opened this issue 2 years ago • 4 comments

discovery version:


<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>         
            <version>2021.0.1.0</version>
</dependency>

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>         
            <version>2021.0.1.0</version>
</dependency>

<dependency>
            <groupId>com.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>         
            <version>2021.0.1</version>
</dependency>

<dependency>
            <groupId>com.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>         
            <version>2.6.6</version>
</dependency>

cloud config动态更新配置时,调用ContextRefresher#refresh NacosDiscoveryClientConfiguration类会重新初始化。 问题在每次注入的NacosServiceManager内部都是空的。这样每次都会新创建客户端,导致重复创建很多线程,之前客户端的线程也没有销毁。 lADPJwnIziEJGojNBG_NDo0_3725_1135 jpg_720x720q90g

NacosWatch在通过NacosServiceManager获取客户端内部都为空,就会再次创建NacosNamingService。 不只在NacosWatch,其他有使用到NacosServiceManager的地方都会有这个问题。

Master-Jack avatar Aug 10 '22 04:08 Master-Jack

这个问题你是实际验证过的还是你的理解?如果是实际验证有问题,麻烦提供一个简易复现demo

yuhuangbin avatar Aug 10 '22 08:08 yuhuangbin

引入上述依赖,再加入config和bootstrap依赖

<dependency>
            <groupId>com.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>         
            <version>3.1.1</version>
</dependency>
<dependency>
            <groupId>com.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>         
            <version>3.1.1</version>
</dependency>
<dependency>
            <groupId>com.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>         
            <version>2.6.6</version>
</dependency>

成功连通config后 在代码中注入 ContextRefresher 。写个接口调用他的 refresh方法就能复现了。debug到NamingFactory的creteNamingService。就发现每次刷新都会创建客户端。 好像只有config会这样,nacos的config不会触发

Master-Jack avatar Aug 10 '22 09:08 Master-Jack

使用 spring-cloud-starter-config做动态配置没有具体测试过,你可以将NacosServiceManager中的NamingService和NamingMaintainService属性设置为static,本地测试一下方便吗?

yuhuangbin avatar Aug 10 '22 13:08 yuhuangbin

可以给一份最小示例代码复现这个问题吗

DanielLiu1123 avatar Aug 10 '22 14:08 DanielLiu1123

静态变量可以

------------------ 原始邮件 ------------------ 发件人: 余黄彬 @.> 发送时间: 2022年8月10日 21:43 收件人: alibaba/spring-cloud-alibaba @.> 抄送: Master-Jack @.>, Author @.> 主题: Re: [alibaba/spring-cloud-alibaba] 当spring 容器刷新 重复创建NacosNamingService客户端,线程多达上万引起OOM (Issue #2703)

使用 spring-cloud-starter-config做动态配置没有具体测试过,你可以将NacosServiceManager中的NamingService和NamingMaintainService属性设置为static,本地测试一下方便吗?

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

Master-Jack avatar Aug 11 '22 10:08 Master-Jack

Long time without response and close first.

steverao avatar Aug 25 '22 00:08 steverao