!7 set flag OshiNotSticky. cm MemoryTrayIcon > DynPrintLog { transient S value; // OS size in MB + free memory transient JLabel lbl; transient bool _startMinimized = true; switchable bool countSwap = true; switchable double interval = 10.0; // restart to take effect switchable bool showOSSizeInTray = true; // otherwise only free mem, full specs in tooltip transient long processSize, freeMem, totalMem; start { dm_registerAs_direct processSize(); dm_vmBus_answerToMessage freeSystemMemory(() -> freeMem); dm_vmBus_answerToMessage totalSystemMemory(() -> totalMem); doEveryAndNow(interval, r actualUpdate); dm_addTrayIcon(onLeftClick(rThreadEnter dm_verboseGC, lbl = dm_fieldLabel_noAutoToolTip('value))); componentPopupMenuItems(lbl, "Garbage Collect", rThreadEnter { dm_gc(); actualUpdate(); }, "Show Module", rThreadEnter dm_showModule, "Remove", rThreadEnter dm_deleteModule); } void actualUpdate { processSize = oshi_currentProcessResidentSize(); long mb = toM(processSize); GlobalMemory mem = oshi_systemMemory(); totalMem = mem.getTotal(); long mb2 = freeSystemMemory(mem); if (countSwap) mb2 -= mem.getSwapUsed(); freeMem = mb2; mb2 = toM(mb2); if (set_trueIfChanged(this, value := (showOSSizeInTray ? mb + " / " : "") + mb2)) { fireChangeWithoutPersisting(); vmBus_send processSize(processSize); } toolTip(lbl, "OS size in memory: " + mb + " MB, free system memory: " + mb2 + " MB"); } }