/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.github.geophile.erdo.memorymonitor; public class MemoryTracker<T extends MemoryTracker.Trackable<T>> { // For use by the owner of a tracked object, to register a new object. public void object(T newObject) { if (object == null && newObject == null) { // Nothing to do } else if (newObject == null) { // object != null memoryMonitor.track(memoryTrackerId, objectSize, 0); } else if (object == null) { // newObject != null objectSize = newObject.sizeBytes(); memoryMonitor.track(memoryTrackerId, 0, objectSize); } else { // both != null objectSize = newObject.sizeBytes(); memoryMonitor.track(memoryTrackerId, objectSize, objectSize); } object = newObject; } public T object() { return object; } // For use by the tracked object itself, to track changes in its size. public void track(long newSize) { memoryMonitor.track(memoryTrackerId, objectSize, newSize); objectSize = newSize; } public MemoryTracker(MemoryMonitor memoryMonitor, int memoryTrackerId) { this.memoryMonitor = memoryMonitor; this.memoryTrackerId = memoryTrackerId; } private final MemoryMonitor memoryMonitor; private T object; private long objectSize; private int memoryTrackerId; public interface Trackable<T> { long sizeBytes(); } }