Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,9 @@
*/
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);
Expand All @@ -104,6 +104,7 @@ public class AboutWindow extends Window implements EventListener<Event> {

protected Button btnAdempiereLog;
protected Button btnReloadLogProps;
protected Button btnGC;

private Listbox levelListBox;

Expand All @@ -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");
Expand Down Expand Up @@ -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");
Expand All @@ -274,13 +266,26 @@ 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);
btnReloadLogProps.addEventListener(Events.ON_CLICK, this);
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");
Expand Down Expand Up @@ -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()))
Expand Down Expand Up @@ -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:<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
*/
Expand Down