【发布时间】:2023-03-06 17:04:01
【问题描述】:
我正在使用[org.clojure/clojure "1.10.1"],[org.clojure/core.async "1.2.603"] 和最新的 Amazon Corretto 11 JVM,如果它们有任何关系的话。
以下代码是生产中使用的代码的简化版本,它确实会导致内存泄漏。我不知道为什么会发生这种情况,但怀疑这可能是由于频道的子/取消子。谁能帮助指出我的代码可能出错的地方或如何修复内存泄漏?
(ns test-gc.core
(:require [clojure.core.async :as a :refer [chan put! close! <! go >! go-loop timeout]])
(:import [java.util UUID]))
(def global-msg-ch (chan (a/sliding-buffer 200)))
(def global-msg-pub (a/pub global-msg-ch :id))
(defn io-promise []
(let [id (UUID/randomUUID)
ch (chan)]
(a/sub global-msg-pub id ch)
[id (go
(let [x (<! ch)]
(a/unsub global-msg-pub id ch)
(:data x)))]))
(defn -main []
(go-loop []
(<! (timeout 1))
(let [[pid pch] (io-promise)
cmd {:id pid
:data (rand-int 1E5)}]
(>! global-msg-ch cmd)
(println (<! pch)))
(recur))
(while true
(Thread/yield)))
例如,快速堆转储提供以下统计信息:
-
按实例数分类
-
java.util.LinkedList5,157,128 (14.4%) -
java.util.concurrent.atomic.AtomicReference3,698,382 (10.3%) -
clojure.lang.Atom3,094,279 (8.6%) - ...
-
-
按实例大小分类
-
java.lang.Object[]210,061,752 B (13.8%) -
java.util.LinkedList206,285,120 B (13.6%) -
clojure.lang.Atom148,525,392 B (9.8%) -
clojure.core.async.impl.channels.ManyToManyChannel132,022,336 B (8.7%) - ...
-
【问题讨论】:
-
这段代码的目标是什么?
-
@AlanThompson 我承认这是一个糟糕的代码/设计。但主要目标是处理 API 调用的异步响应。客户端的请求被分发到多个模块,完成后,带有额外数据的完成消息将发送到
global-msg-ch,然后为每个请求检索(您可能猜到,每个请求都标记为UUID) . -
你有什么样的内存泄漏?你能粘贴内存不足异常吗?
-
@rcastellcastell 它只是说
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "async-dispatch-1"alike。
标签: clojure core.async