【问题标题】:What is the best way to measure how much memory a Clojure program uses?衡量 Clojure 程序使用多少内存的最佳方法是什么?
【发布时间】:2014-11-30 13:11:14
【问题描述】:

如何测量 Clojure 程序使用了多少内存?

我注意到,即使是小程序,也就是制作类似

的东西
(println "Hello World")

可以消耗几十兆的RAM,根据时间(GNU时间),ps 和其他类似的工具。

是否有任何正确的方法来检测 Clojure 程序的内存量 真的需要吗?

如何限制 Clojure 程序的内存使用量? 是否可以说“占用不超过 1 MB”之类的内容?

【问题讨论】:

  • Clojure 的内存占用受限于 JVM 的大小。 Clojure 是一门很棒的语言,但如果你特别需要一个运行在 1MB 以下的程序,你应该看看其他语言。
  • @user100464:好吧,你也许是对的,但是说 20MB 怎么样?
  • 我建议您编写打印“hello world”然后在读取或线程睡眠或其他内容时暂停的 Clojure 程序。暂停时,使用可用的操作系统工具查看正在使用的内存量。
  • @user100464:为什么这么复杂?你可以直接使用time -v,或者使用jmap,这根本不是问题。问题是我怎样才能让我的程序小于 20MB

标签: clojure jvm memory-profiling


【解决方案1】:

Clojure 在 JVM 上运行,因此您可以像在 Java 中一样检查它使用了多少内存并限制它的内存。

检查内存使用情况:

final double freeMemory = Runtime.getRuntime().freeMemory() / (double) 1024;
final double totalMemory = Runtime.getRuntime().totalMemory() / (double) 1024;
final double usedMemory = totalMemory - freeMemory;

在 Clojure 中(请原谅我的成语水平不佳,还是 Clojure 的初学者)

(float (/ (- (-> (java.lang.Runtime/getRuntime) (.totalMemory)) (-> (java.lang.Runtime/getRuntime) (.freeMemory))) 1024))

(您可以使用 Java 互操作轻松转换为 Clojure,不确定是否已经有 Clojure 库用于此)。

Limit JVM maximum memory:

java -Xmx<memory>

例如:java -Xmx1024m 会将 JVM 限制为 1 GiB。

【讨论】:

  • 默认是 1G,除非你有超过 4GB 的内存,它会限制到物理内存的 25%。
  • 明确地说,-Xmx 开关控制 JVM 使用多少堆。它不控制总内存占用。如果 OP 有兴趣在 1MB(甚至 20MB)以下运行,非堆内存也很重要。
  • 不确定 OP 是否真的询问过他的代码需要多少费用。 JVM分配了多少,但在后一种情况下,IMO无需从分配的内存中减去已使用的内存。
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多