Je crée cette application de barre de menu qui affiche la chanson en cours de lecture dans la barre d'état de Mac OS X. Pour obtenir le statut de lecteur de Spotify, je dois créer et exécuter un AppleScript et obtenir la sortie de cela. Le résultat est ensuite dessiné à l'aide de drawString() à partir de Graphics2D, qui est défini sur un BufferedImage qui est ensuite défini comme l'icône de la barre d'état.Fuite de mémoire avec Runnable et ScheduledExecutorService
Le code entier est 4 classes et facile à suivre, ici: https://github.com/ZinoKader/Menify
maintenant sur le problème
Mon runnable semble manger de la mémoire comme je ne l'ai vu avant. Chaque seconde, l'application utilise 2-3 Mo plus de RAM, et atteint pour les gigaoctets si je le laisse être. Ce que j'ai essayé jusqu'ici est de vider et de disposer de toutes mes images et ressources Graphics2D, vider et fermer chaque inputtream, outputtream et détruire l'objet de processus que je crée dans AppleScripthHelper.
Même quelque chose comme ça, l'appel d'une méthode statique commence à accumuler de la RAM très rapidement.
final Runnable refreshPlayingText =() -> {
AppleScriptHelper.evalAppleScript(ScriptConstants.SPOTIFY_META_DATA_SCRIPT);
}
//update every 50ms
mainExecutor.scheduleAtFixedRate(refreshPlayingText, 0, 50, TimeUnit.MILLISECONDS);
et 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();
}
}
La question est, ce qui gruge tout cela RAM? Pourquoi apparemment rien n'est ramassé?
Pouvez-vous poster 'AppleScriptHelper # evalAppleScript'? –
@JacobG. D'accord, c'est fait! – Zino