Clojure输出进程内存使用情况

上次我们用Clojure获取系统内存占用, 但是只输出系统整体的内存使用量, 如果我需要查看每个具体的进程的使用量的话, 必须写一个新的办法. 我需要的是列出所有进程, 按内存使用量大小排序, 以MB为单位.

Windows下可以列出全部进程内存用量的命令是tasklist. 输出中包含进程名列和内存使用量列, 内存用量用KB为单位, 我们会从每一行中提取进程名和内存用量, 将字符串解析为数字, 并转换为MB为单位, 然后按照内存使用量列排序, 最后打印输出.

最好可以选择输出前面的几行, 因为最需要监控的是内存占用最大的那几个进程. 下面是全部代码

 
(defn get-p-name [line]
  (cond
    (.startsWith line "System Idle Process" ) "System Idle Process"      
    (.startsWith line "System" ) "System"
    :else (re-find #"^.*?\.exe" line)
  )
)
 
(defn kb-to-mb [bytes] (/ bytes (* 1024.0 1.0 )))
 
(defn kb-to-m [kb-str]
  (kb-to-mb (Float/parseFloat kb-str))
)
 
(defn get-p-mem [line]
  (kb-to-m (.replace (second (re-find #"([0-9,]*?) K" line)) "," ""))
)
 
 
(defn pretty-memp [v take-count]
  (join "\n" (take take-count (map #(str (first %) ": " (second %)) v) ))
)
 
(defn memp-inner []
   (reverse (map #(vec [(first %) (java.lang.String/format "%.1f M" (into-array [(second %)]))])
    (sort-by #(second %) (map #(vec [(get-p-name %) (get-p-mem %)]) (rest (rest (rest (shell "tasklist.exe" ""))))))
  ))
)
 
(defn memp 
  ([] (println (pretty-memp (memp-inner) 30)))
  ([take-count ] (println (pretty-memp (memp-inner) take-count)))
)
 

默认情况下输出前面30个进程的内存用量, 或者可以指定前面n行的数据.

输出前面30个进程的数据

clojure window 进程 内存查看

指定前面10个进程

clojure window 进程 内存查看