2024 Clojure 状态调查中分享你的想法!

欢迎!请参阅关于页面以获取更多关于如何操作的信息。

0
命名空间和变量
编辑

我们的服务器正在经历内存泄漏。为了调查发生了什么,我使用了jmap来转储 JVM 并获得了以下文件

No dump file specified
 num     #instances         #bytes  class name (module)
-------------------------------------------------------
   1:        904887       79630056  java.lang.reflect.Method ([email protected])
   2:        935204       50874608  [Ljava.lang.Object; ([email protected])
   3:        889710       47099400  [B ([email protected])
   4:         85795       26006880  [C ([email protected])
   5:        518846       22286056  [I ([email protected])
   6:        781108       18746592  java.lang.String ([email protected])
   7:        382891       15315640  java.math.BigInteger ([email protected])
   8:        370774       14830960  java.math.BigDecimal ([email protected])
   9:        153329       12266320  java.lang.reflect.Constructor ([email protected])
...
 152:          1665         146520  java.util.regex.Pattern ([email protected])
 153:          3638         145520  com.newrelic.agent.deps.org.objectweb.asm.tree.LdcInsnNode
 154:          9043         144688  exchange.api.restful.orders$fn__48874$fn__48879
 155:          9043         144688  exchange.api.restful.orders$fn__48874$fn__48881
 156:          9043         144688  exchange.api.restful.orders$fn__48874$fn__48883
 157:          9043         144688  exchange.api.restful.orders$fn__48874$fn__48885
 158:          9043         144688  exchange.api.restful.orders$fn__48874$fn__48887
 159:          9043         144688  exchange.api.restful.orders$fn__48874$fn__48892
 160:          9006         144096  java.util.Formatter$Flags ([email protected])
 161:          8973         143568  java.util.concurrent.atomic.AtomicBoolean ([email protected])
...
 600:           296           7104  java.math.MathContext ([email protected])
 601:           221           7072  java.lang.invoke.BoundMethodHandle$Species_L ([email protected])
 602:           221           7072  java.lang.invoke.LambdaForm$NamedFunction ([email protected])
 603:           438           7008  clojure.core$distinct$step__6413
 604:           291           6984  taoensso.nippy$read_kvs_into$fn__36561
 605:           218           6976  sun.nio.fs.UnixPath ([email protected])
 606:           218           6976  taoensso.carmine.protocol.EnqueuedRequest
 607:           173           6920  java.nio.channels.ClosedChannelException ([email protected])
 608:           431           6896  clojure.core.async.impl.ioc_macros$return_chan$fn__21752
 609:           287           6888  javax.management.ImmutableDescriptor ([email protected])
...

因此,您可能从它中解读出,它是一个 API 服务。从实例数量来看,我决定exchange.api.restful.orders$fn__48874$*是问题的根源。(或者我是错的。我的同事建议 Redis 出错了。)

但是这里的问题是:它是哪个函数/API?我该如何定位它?

1 个答案

+1

选中
 
最佳答案

尝试使用 (fn some-name [] ...) 而不是 (fn [] ...)#(...)

by
实际上,端点看起来像(使用 `ring` 和 `compojure`)

```clojure
(defroutes plus
  (GET "/plus" []
    :return {:result Long}
    :query-params [x :- Long, y :- Long]
    :summary "将两个数字相加"
    (ok {:result (+ x y)})))
```

因此我不确定在哪里添加函数名。
by
也许可以将 `(+ x y)` 提取为一个函数,例如 `(defn add [x y] (+ x y))` 并使用 `(ok {:result (add x y)})`。这使用的是 `compojure-api` 而不是 `compojure`... 我从未使用过它,不确定它是如何工作的。如果它不起作用,尝试分别监控 `(+ x y)` 部分,针对每个可疑的端点。您可以从 REPL 使用 https://github.com/clojure-goes-fast/clj-memory-meter
...