From 21d4ef254deeee8cae5459c6cf4cfb996fb7040b Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sun, 06 Jan 2019 23:32:21 +0000
Subject: [PATCH] JProfiler session for optimizing heap space (a big memory leak fixed).
---
borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java | 10 ++++++++++
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java | 21 +++++++++++++++------
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java | 6 ++++++
3 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
index 6d3e043..a5c6355 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
@@ -34,7 +34,7 @@
BorgCommand command = new BorgCommand()
.setParams("--version")
.setDescription("Getting borg version.");
- JobResult<String> jobResult = execute(command).getResult();
+ JobResult<String> jobResult = getResult(command);
if (jobResult == null || jobResult.getStatus() != JobResult.Status.OK) {
return null;
}
@@ -55,7 +55,7 @@
.setCommand("info")
.setParams("--json") // --progress has no effect.
.setDescription("Loading info of repo '" + repoConfig.getDisplayName() + "'.");
- JobResult<String> jobResult = execute(command).getResult();
+ JobResult<String> jobResult = getResult(command);
if (jobResult == null || jobResult.getStatus() != JobResult.Status.OK) {
return null;
}
@@ -88,7 +88,7 @@
.setCommand("list")
.setParams("--json") // --progress has no effect.
.setDescription("Loading list of archives of repo '" + repoConfig.getDisplayName() + "'.");
- JobResult<String> jobResult = execute(command).getResult();
+ JobResult<String> jobResult = getResult(command);
if (jobResult == null || jobResult.getStatus() != JobResult.Status.OK) {
log.error("Can't load archives from repo '" + repository.getName() + "'.");
return;
@@ -130,7 +130,7 @@
.setArchive(archive.getName())
.setParams("--json", "--log-json", "--progress")
.setDescription("Loading info of archive '" + archive.getName() + "' of repo '" + repoConfig.getDisplayName() + "'.");
- JobResult<String> jobResult = execute(command).getResult();
+ JobResult<String> jobResult = getResult(command);
if (jobResult == null || jobResult.getStatus() != JobResult.Status.OK) {
return;
}
@@ -193,7 +193,9 @@
if (jobResult == null ||jobResult.getStatus() != JobResult.Status.OK) {
return null;
}
- return job.payload;
+ List<BorgFilesystemItem> items = job.payload;
+ job.cleanUp(); // payload will be released.
+ return items;
}
/**
@@ -221,10 +223,17 @@
.setDescription("Extract content of archive '" + archive.getName()
+ "' of repo '" + repoConfig.getDisplayName() + "': "
+ path);
- JobResult<String> jobResult = execute(command).getResult();
+ JobResult<String> jobResult = getResult(command);
return restoreDir;
}
+ private static JobResult<String> getResult(BorgCommand command) {
+ BorgJob<Void> job = execute(command);
+ JobResult<String> jobResult = job.getResult();
+ job.cleanUp();
+ return jobResult;
+ }
+
private static BorgJob<Void> execute(BorgCommand command) {
Validate.notNull(command);
return BorgQueueExecutor.getInstance().execute(command);
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
index d5f057e..c21034d 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
@@ -121,4 +121,10 @@
}
return clone;
}
+
+ @Override
+ public void cleanUp() {
+ super.cleanUp();
+ payload = null;
+ }
}
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java
index 7564241..d551e57 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java
@@ -139,4 +139,14 @@
EnvironmentUtils.addVariableToEnvironment(env, name + "=" + value);
}
}
+
+ /**
+ * Frees the output streams.
+ * Should be called after a job was done, failed or cancelled while running.
+ */
+ public void cleanUp() {
+ log.info("Freeing resources of job: " + commandLineAsString);
+ outputStream = null;
+ errorOutputStream = null;
+ }
}
--
Gitblit v1.10.0