0

私は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:詳細を記入する必要がある場合はお知らせください。

4

2 に答える 2

3

JVMはそれ自体のメモリを管理します。オペレーティングシステムからメモリを取得すると、通常はそれを返しません。(または、少なくともSunのJVMがそうするのを見たことがないので、強制する方法があるかもしれません...)

とにかく、おそらくすでにインストールされているツールを使用してプログラムが実際にメモリリークしているかどうかを確認する簡単な方法は、JConsoleをJVMに接続し、ヒープの使用状況を監視することです。Activity Monitorを見ても、何も役に立ちません。

http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

于 2012-08-05T14:44:51.560 に答える
2

replでこれを行っている場合、の結果は後で使用するためpmapに保存されます。*1これは本番環境では発生しません。たとえば、を使用して、担当者で発生しないようにすることができます(dorun (pmap ...))

于 2012-08-04T23:41:29.187 に答える