繁体   English   中英

Flux中的内存泄漏,但是在哪里?

[英]Memory leak in Flux, but where?

我的应用程序包含一个相当复杂的FluxMono链系统。 运行程序时,我可以使用VisualVM检测内存泄漏。

问题是,尽管我可以清楚地看到是哪些实例引起了内存问题,但是由于响应代码的性质,这些实例的引用树对我来说几乎是不透明的。 请参见下面的屏幕截图。

VisualVM中参考树的屏幕快照

所以我的问题是:有没有办法阅读这棵树? 我可以告诉发生内存泄漏的地方,或者至少是哪个操作员吗?

正如参考树提到的PublishOnSubscriber我删除了所有显式调用.publishOn实例,但PublishOnSubscriber成功。

内存泄漏可能是处理器配置为无订阅者的无限制队列的标志。 可视vm屏幕截图在路径中显示“队列”,这就是我建议这样做的原因。

以下将导致内存泄漏:

UnicastProcessor<Integer> subject = UnicastProcessor.create();
int j = 0;
for(int i = 0; i < 400000000; i++) {
    Integer g = Integer.valueOf(i);
    subject.onNext(g);
    if(j++ > 100000) {
        j = 0;
        long memoryUsage = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println(memoryUsage / 1024 / 1024);
    }
}

默认情况下,调用UnicastProcessor.create()使用一个无界队列。 由于没有订阅者,因此项目在队列中累积。 解决方案只是确保处理器具有订户,如下所示:

        UnicastProcessor<Integer> subject = UnicastProcessor.create();
---->   subject.subscribe();
        int j = 0;
        for(int i = 0; i < 400000000; i++) {
            Integer g = Integer.valueOf(i);
            subject.onNext(g);
            if(j++ > 100000) {
                j = 0;
                long memoryUsage = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
                System.out.println(memoryUsage / 1024 / 1024);
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM