IDEMPIERE-6130 Move garbage collection to a button in About Window (#2341)

This commit is contained in:
Carlos Ruiz 2024-04-27 12:57:53 +02:00
parent 439b158224
commit 4c7a1b124f
1 changed files with 44 additions and 14 deletions

View File

@ -85,9 +85,9 @@ import org.zkoss.zul.Vbox;
*/ */
public class AboutWindow extends Window implements EventListener<Event> { public class AboutWindow extends Window implements EventListener<Event> {
/** /**
* generated serial id *
*/ */
private static final long serialVersionUID = -4235323239552159150L; private static final long serialVersionUID = -5590393631865037228L;
/** Logger */ /** Logger */
private static final CLogger log = CLogger.getCLogger(AboutWindow.class); private static final CLogger log = CLogger.getCLogger(AboutWindow.class);
@ -104,6 +104,7 @@ public class AboutWindow extends Window implements EventListener<Event> {
protected Button btnAdempiereLog; protected Button btnAdempiereLog;
protected Button btnReloadLogProps; protected Button btnReloadLogProps;
protected Button btnGC;
private Listbox levelListBox; private Listbox levelListBox;
@ -120,15 +121,6 @@ public class AboutWindow extends Window implements EventListener<Event> {
*/ */
private void init() { private void init() {
Runtime runtime = Runtime.getRuntime();
long usedMemoryBefore = runtime.totalMemory() - runtime.freeMemory();
System.runFinalization();
System.gc();
try {Thread.sleep(100);} catch (InterruptedException e) {} // Give some time for GC to complete
long usedMemoryAfter = runtime.totalMemory() - runtime.freeMemory();
long freedMemory = usedMemoryAfter - usedMemoryBefore;
log.warning(String.format("Memory: total %,d, before gc: %,d, after gc %,d, freed by gc %,d bytes%n", runtime.totalMemory(), usedMemoryBefore, usedMemoryAfter, freedMemory));
this.setPosition("center"); this.setPosition("center");
this.setTitle(ThemeManager.getBrowserTitle()); this.setTitle(ThemeManager.getBrowserTitle());
this.setSclass("popup-dialog about-window"); this.setSclass("popup-dialog about-window");
@ -257,11 +249,11 @@ public class AboutWindow extends Window implements EventListener<Event> {
} }
} }
MUser user = MUser.get(Env.getCtx());
levelListBox.setEnabled(false); levelListBox.setEnabled(false);
if (Env.getAD_Client_ID(Env.getCtx()) == 0) if (user.isAdministrator())
{ {
MUser user = MUser.get(Env.getCtx()); if (Env.getAD_Client_ID(Env.getCtx()) == 0)
if (user.isAdministrator())
{ {
levelListBox.setEnabled(true); levelListBox.setEnabled(true);
levelListBox.setTooltiptext("Set trace level. Warning: this will effect all session not just the current session"); levelListBox.setTooltiptext("Set trace level. Warning: this will effect all session not just the current session");
@ -274,6 +266,13 @@ public class AboutWindow extends Window implements EventListener<Event> {
hbox.appendChild(new Space()); hbox.appendChild(new Space());
hbox.appendChild(btnAdempiereLog); hbox.appendChild(btnAdempiereLog);
ZKUpdateUtil.setHflex(hbox, "1");
ZKUpdateUtil.setVflex(hbox, "0");
vbox.appendChild(hbox);
hbox = new Hbox();
hbox.setAlign("center");
hbox.setPack("start");
btnReloadLogProps = new Button("Reload Log Props"); btnReloadLogProps = new Button("Reload Log Props");
btnReloadLogProps.setTooltiptext("Reload the configuration of log levels from idempiere.properties file"); btnReloadLogProps.setTooltiptext("Reload the configuration of log levels from idempiere.properties file");
LayoutUtils.addSclass("txt-btn", btnReloadLogProps); LayoutUtils.addSclass("txt-btn", btnReloadLogProps);
@ -281,6 +280,12 @@ public class AboutWindow extends Window implements EventListener<Event> {
hbox.appendChild(new Space()); hbox.appendChild(new Space());
hbox.appendChild(btnReloadLogProps); hbox.appendChild(btnReloadLogProps);
} }
btnGC = new Button("Garbage Collect");
btnGC.setTooltiptext("Perform a Garbage Collection on the JVM");
LayoutUtils.addSclass("txt-btn", btnGC);
btnGC.addEventListener(Events.ON_CLICK, this);
hbox.appendChild(new Space());
hbox.appendChild(btnGC);
} }
ZKUpdateUtil.setHflex(hbox, "1"); ZKUpdateUtil.setHflex(hbox, "1");
@ -506,6 +511,8 @@ public class AboutWindow extends Window implements EventListener<Event> {
downloadAdempiereLogFile(); downloadAdempiereLogFile();
else if (event.getTarget() == btnReloadLogProps) else if (event.getTarget() == btnReloadLogProps)
reloadLogProps(); reloadLogProps();
else if (event.getTarget() == btnGC)
garbageCollection();
else if (event.getTarget() == levelListBox) else if (event.getTarget() == levelListBox)
setTraceLevel(); setTraceLevel();
else if (Events.ON_CLICK.equals(event.getName())) else if (Events.ON_CLICK.equals(event.getName()))
@ -562,6 +569,29 @@ public class AboutWindow extends Window implements EventListener<Event> {
} }
} }
/**
* Call JVM GC
*/
private void garbageCollection() {
Runtime runtime = Runtime.getRuntime();
long usedMemoryBefore = runtime.totalMemory() - runtime.freeMemory();
System.runFinalization();
System.gc();
try {Thread.sleep(1000);} catch (InterruptedException e) {} // Wait 1 second for GC to complete
long usedMemoryAfter = runtime.totalMemory() - runtime.freeMemory();
long freedMemory = usedMemoryAfter - usedMemoryBefore;
String msg = String.format("Memory: total %,d, before gc: %,d, after gc %,d, freed by gc %,d bytes%n", runtime.totalMemory(), usedMemoryBefore, usedMemoryAfter, freedMemory);
log.warning(msg);
msg = String.format("Memory in bytes:<ul>"
+ "<li>Total = %,d</li>"
+ "<li>Used before gc = %,d</li>"
+ "<li>Used after gc = %,d</li>"
+ "<li>Freed by gc = %,d</li>"
+ "</ul>",
runtime.totalMemory(), usedMemoryBefore, usedMemoryAfter, freedMemory);
Dialog.info(0, "", msg, "JVM Garbage Collection");
}
/** /**
* Change trace/log level * Change trace/log level
*/ */