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> {
/**
* generated serial id
*
*/
private static final long serialVersionUID = -4235323239552159150L;
private static final long serialVersionUID = -5590393631865037228L;
/** Logger */
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 btnReloadLogProps;
protected Button btnGC;
private Listbox levelListBox;
@ -120,15 +121,6 @@ public class AboutWindow extends Window implements EventListener<Event> {
*/
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.setTitle(ThemeManager.getBrowserTitle());
this.setSclass("popup-dialog about-window");
@ -257,11 +249,11 @@ public class AboutWindow extends Window implements EventListener<Event> {
}
}
levelListBox.setEnabled(false);
if (Env.getAD_Client_ID(Env.getCtx()) == 0)
{
MUser user = MUser.get(Env.getCtx());
levelListBox.setEnabled(false);
if (user.isAdministrator())
{
if (Env.getAD_Client_ID(Env.getCtx()) == 0)
{
levelListBox.setEnabled(true);
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(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.setTooltiptext("Reload the configuration of log levels from idempiere.properties file");
LayoutUtils.addSclass("txt-btn", btnReloadLogProps);
@ -281,6 +280,12 @@ public class AboutWindow extends Window implements EventListener<Event> {
hbox.appendChild(new Space());
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");
@ -506,6 +511,8 @@ public class AboutWindow extends Window implements EventListener<Event> {
downloadAdempiereLogFile();
else if (event.getTarget() == btnReloadLogProps)
reloadLogProps();
else if (event.getTarget() == btnGC)
garbageCollection();
else if (event.getTarget() == levelListBox)
setTraceLevel();
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
*/