我正在学习Clojure,我想知道为什么我的应用程序消耗了这么多 内存,一旦使用这些数据结构完成就不会释放它。一世 想象一下Clojure中有一些我不知道的东西 使应用程序错误地保留某些东西。
这是一个简单的缩略图应用程序。它从目录中获取图像,调整大小
将它们放入另一个目录中。它使用javax.imageio
和
java.awt.image
个库。
(def thumb "path to thumbnails directory")
(defn get-thumb-filename [thumb-dir filename width]
(str thumb-dir (fs/name filename) "_" width ".jpg"))
(defn get-thumb-filename-100 [filename]
(get-thumb-filename thumb filename 100))
(defn small-thumbnail [filename]
(make-thumbnail filename (get-thumb-filename-100 filename) 100))
(defn make-thumbnail [filename new-filename width]
(let [img (javax.imageio.ImageIO/read (as-file filename))
imgtype (java.awt.image.BufferedImage/TYPE_INT_ARGB)
width (min (.getWidth img) width)
height (* (/ width (.getWidth img)) (.getHeight img))
simg (java.awt.image.BufferedImage. width height imgtype)
g (.createGraphics simg)]
(.drawImage g img 0 0 width height nil)
(.dispose g)
(javax.imageio.ImageIO/write simg "png" (as-file new-filename))))
;; `images` is a list of original filenames
;; Kick it off with...
(pmap small-thumbnail images)
此代码是Noir视图的一部分,这意味着应用程序不会退出 完成所有图像的处理后。
当我运行此代码时,我的电脑开始变得疯狂。风扇响亮而且 主java进程使用超过1GB的内存。处理完所有图像后 CPU使用率降至< 5%,但内存使用率保持不变。
如何让它释放明确不需要的所有内存 什么?
谢谢!
PS:如果您需要我填写任何详细信息,请告诉我。
答案 0 :(得分:3)
JVM管理自己的内存。一旦从操作系统获取内存,它通常不会回复。 (或者至少我从未见过Sun的JVM这样做,可能有某种方法可以强制它......)
无论如何,使用您可能已安装的工具来查看程序是否实际泄漏内存的简单方法是将JConsole附加到JVM并仅监视堆使用情况。查看Activity Monitor不会告诉您任何有用的信息。
http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html
答案 1 :(得分:2)
如果您在repl上执行此操作,pmap
的结果将存储在*1
中以供日后使用;在生产过程中不会发生这种情况,你可以阻止它在repl上发生,例如(dorun (pmap ...))
。