gpt4 book ai didi

linux - 如何在 clojure + jvm 1.8 中查找内存 "leaks"

转载 作者:太空狗 更新时间:2023-10-29 11:13:33 24 4
gpt4 key购买 nike

我的 clojure 应用程序在运行 java 8 的 linux 系统上表现出奇怪的行为。具体来说,当使用 httpkit 通过 websockets 与客户端通信时,内存占用明显无限制地增长 - 取决于系统进程然后被操作系统杀死。

我查看了 jconsole 中的内存使用情况,显然是(新)元空间 在不断增长。我设法通过将 -XX:MaxMetaspaceSize=128m 传递给 jar 来解决这个问题:在这种情况下,只要元空间内存图超过 128m,它就会下降,并且程序最终不会吃掉所有内存。但这是一种解决方法——我想了解为什么会出现这种增长,但我不确定如何进行。在 C++ 中,我会使用 valgrind 追踪泄漏,但由于 Java/Clojure 是垃圾收集的,我不确定要寻找什么。

我不是 100% 确定它只是 httpkit 代码部分,但从我的测试来看它似乎是 - 这是一个代码摘录,我在其中监听消息并根据消息发回一个 json 对象包含一些数据; coreparams-atom 预计在任何时候都有大约 10 个 float 条目。

(httpkit/on-receive channel (fn [data]
(let [data-map (json/read-str data)
param (first (get data-map "data"))
value (second (get data-map "data"))]
(case (get data-map "type")
; ...
"curparams" (let [tosend (json/write-str
{:type "curparams"
:data (-> @state/coreparams-atom
(assoc :timestamp (db/timestamp))
(util/keyword-replace-char ":" "_"))})]
(httpkit/send! channel tosend))
; ...
))))

系统:

  • Ubuntu 14.04
  • OpenJDK 运行时环境(构建1.8.0_40-内部-b27)
  • 6GB 内存
  • Clojure 1.6.0
  • http-kit 2.1.6

在我目前无法访问的 CentOS 上的同一 JVM 上的类似行为,因此无法提供详细规范。

最佳答案

内存采样(使用 VisualVM 或其他工具,例如 YourKit)通常会为您指明问题的大致方向。例如,它可以告诉您这些类属于哪些包导致内存泄漏。之后您可以进行更详细的分析。

我过去也遇到过 VisualVM 卡住的问题。您可以尝试的一件事是使用 JMX 连接,即您使用 JMX 代理启动您的应用程序并从 VisualVM 连接到它,就好像它是远程的一样。参见 the docs获取更多信息。

也就是说,在我看来,YourKit 是一款更出色的分析软件。

关于linux - 如何在 clojure + jvm 1.8 中查找内存 "leaks",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29491126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com