/* Copyright (c) 2013 Boundless and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/org/documents/edl-v10.html * * Contributors: * Gabriel Roldan (Boundless) - initial implementation */ package org.locationtech.geogig.metrics; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; import java.util.concurrent.TimeUnit; import org.locationtech.geogig.api.Platform; import org.locationtech.geogig.api.porcelain.ConfigException; import org.locationtech.geogig.storage.ConfigDatabase; import com.google.common.util.concurrent.AbstractScheduledService; import com.google.inject.Provider; class HeapMemoryMetricsService extends AbstractScheduledService { private final long MB = 1024 * 1024; private static final MemoryMXBean MEMORY_MX_BEAN = ManagementFactory.getMemoryMXBean(); private Provider<Platform> platform; private Provider<ConfigDatabase> configDb; // track memory usage reported in last run to avoid flooding the log file when there were no // changes private long lastHeapUsedMB; private long lastNonHeapUsedMB; public HeapMemoryMetricsService(final Provider<Platform> platform, final Provider<ConfigDatabase> configDb) { this.platform = platform; this.configDb = configDb; } @Override protected void runOneIteration() { try { Boolean enabled = configDb.get().get(MetricsModule.METRICS_ENABLED, Boolean.class) .or(Boolean.FALSE); if (!enabled.booleanValue()) { return; } } catch (ConfigException e) { return;// not in a geogig repository } MemoryUsage heap = MEMORY_MX_BEAN.getHeapMemoryUsage(); MemoryUsage nonHeap = MEMORY_MX_BEAN.getNonHeapMemoryUsage(); long heapUsedMB = heap.getUsed() / MB; long nonHeapUsedMB = nonHeap.getUsed() / MB; // do not flood the log file if memory usage didn't change from last run if (heapUsedMB == lastHeapUsedMB && nonHeapUsedMB == lastNonHeapUsedMB) { return; } long timestamp = platform.get().currentTimeMillis(); int objectPendingFinalizationCount = MEMORY_MX_BEAN.getObjectPendingFinalizationCount(); MetricsModule.MEMORY_LOGGER.info("{},{},{},{}", timestamp, heapUsedMB, nonHeapUsedMB, objectPendingFinalizationCount); lastHeapUsedMB = heapUsedMB; lastNonHeapUsedMB = nonHeapUsedMB; } @Override protected Scheduler scheduler() { final long initialDelay = 5; final long period = 2; final TimeUnit unit = TimeUnit.SECONDS; return Scheduler.newFixedRateSchedule(initialDelay, period, unit); } }