我正在製作此狀態/菜單欄應用程序,該應用程序在Mac OS X的狀態欄中顯示當前正在播放的歌曲。要從Spotify獲取播放器狀態,我必須創建並執行AppleScript並從這得到輸出。然後使用Graphics2D中的drawString()繪製結果,Graphics2D將其設置爲BufferedImage,然後將其設置爲托盤圖標。Runnable和ScheduledExecutorService發生內存泄漏
整個代碼是4類和易於理解,可在這裏:https://github.com/ZinoKader/Menify
現在到這個問題
我可運行似乎吃起來記憶像什麼我以前見過。應用程序每秒鐘會使用2-3MB的RAM,並且如果我離開它,達到千兆字節。到目前爲止我嘗試過的方法是刷新和處理所有圖像和Graphics2D資源,刷新並關閉每個輸入流,outputstream並銷燬在AppleScripthHelper中創建的Process對象。
即使是這樣的事情,只是調用一個靜態方法開始堆積RAM很快。
final Runnable refreshPlayingText =() -> {
AppleScriptHelper.evalAppleScript(ScriptConstants.SPOTIFY_META_DATA_SCRIPT);
}
//update every 50ms
mainExecutor.scheduleAtFixedRate(refreshPlayingText, 0, 50, TimeUnit.MILLISECONDS);
和AppleScriptHelper
class AppleScriptHelper {
private static final int EOF = -1;
static String evalAppleScript(String code) {
String[] args = { "osascript", "-e", code };
try {
Process process = Runtime.getRuntime().exec(args);
process.waitFor();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bigByteArray = new byte[4096];
InputStream is = process.getInputStream();
copyLargeStream(is, baos, bigByteArray); //write to outputstream
String result = baos.toString().trim();
is.close();
baos.flush();
baos.close();
process.destroyForcibly();
return result;
} catch (IOException | InterruptedException e) {
Log.debug(e);
return null;
}
}
private static void copyLargeStream(InputStream input, OutputStream output, byte[] buffer) throws IOException {
int n;
while (EOF != (n = input.read(buffer))) {
output.write(buffer, 0, n);
}
input.close();
output.close();
}
}
所以現在的問題是,什麼是吃了所有的內存?爲什麼似乎沒有垃圾收集?
你可以發佈'AppleScriptHelper#evalAppleScript'嗎? –
@JacobG。好,完成了! – Zino