From 06763561df55a7dd7b0857204b7e788e60f91f69 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Sat, 27 Apr 2024 12:57:53 +0200 Subject: [PATCH] IDEMPIERE-6130 Move garbage collection to a button in About Window (#2341) --- .../adempiere/webui/window/AboutWindow.java | 58 ++++++++++++++----- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/AboutWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/AboutWindow.java index d478607021..4b066a3483 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/AboutWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/AboutWindow.java @@ -85,9 +85,9 @@ */ public class AboutWindow extends Window implements EventListener { /** - * 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 { protected Button btnAdempiereLog; protected Button btnReloadLogProps; + protected Button btnGC; private Listbox levelListBox; @@ -120,15 +121,6 @@ public AboutWindow() { */ 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 @@ protected Tabpanel createTrace() { } } + MUser user = MUser.get(Env.getCtx()); levelListBox.setEnabled(false); - if (Env.getAD_Client_ID(Env.getCtx()) == 0) + if (user.isAdministrator()) { - MUser user = MUser.get(Env.getCtx()); - 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 @@ protected Tabpanel createTrace() { 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 @@ protected Tabpanel createTrace() { 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 @@ else if (event.getTarget() == btnAdempiereLog) 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 @@ private void reloadLogProps() { } } + /** + * 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:
    " + + "
  • Total = %,d
  • " + + "
  • Used before gc = %,d
  • " + + "
  • Used after gc = %,d
  • " + + "
  • Freed by gc = %,d
  • " + + "
", + runtime.totalMemory(), usedMemoryBefore, usedMemoryAfter, freedMemory); + Dialog.info(0, "", msg, "JVM Garbage Collection"); + } + /** * Change trace/log level */