diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java index d508fa1f8f88316f7d5977935295fffc5e1d1673..32fda841503b309bee6dc762a3eaff73142f7966 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java @@ -22,6 +22,10 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + import org.bigbluebutton.red5.client.messaging.ConnectionInvokerService; import org.bigbluebutton.red5.pubsub.MessagePublisher; import org.red5.logging.Red5LoggerFactory; @@ -80,9 +84,41 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter { public boolean appStart(IScope app) { super.appStart(app); connInvokerService.setAppScope(app); + + getHeapStats(); + return true; } - + + private void getHeapStats() { + Runnable getHeapTask = () -> getHeapStatsHelper(); + + ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + executor.scheduleAtFixedRate(getHeapTask, 0, 5, TimeUnit.SECONDS); + } + + private void getHeapStatsHelper() { + int mb = 1024*1024; + + // Getting the runtime reference from system + Runtime runtime = Runtime.getRuntime(); + + long usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / mb; + long freeMemory = runtime.freeMemory() / mb; + long totalMemory = runtime.totalMemory() / mb; + long maxMemory = runtime.maxMemory() / mb; + + Map<String, Object> logData = new HashMap<String, Object>(); + logData.put("used", usedMemory); + logData.put("free", freeMemory); + logData.put("total", totalMemory); + logData.put("max", maxMemory); + + Gson gson = new Gson(); + String logStr = gson.toJson(logData); + log.info("JVM Heap [MB] data={}", logStr); + } + @Override public void appStop(IScope app) { super.appStop(app);