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