package rocks.inspectit.agent.java.sensor.platform; import java.sql.Timestamp; import java.util.Calendar; import rocks.inspectit.agent.java.sensor.platform.provider.MemoryInfoProvider; import rocks.inspectit.agent.java.sensor.platform.provider.OperatingSystemInfoProvider; import rocks.inspectit.agent.java.sensor.platform.provider.factory.PlatformSensorInfoProviderFactory; import rocks.inspectit.shared.all.communication.SystemSensorData; import rocks.inspectit.shared.all.communication.data.MemoryInformationData; /** * This class provides dynamic information about the memory system through MXBeans. * * @author Eduard Tudenhoefner * @author Max Wassiljew (NovaTec Consulting GmbH) */ public class MemoryInformation extends AbstractPlatformSensor { /** Collector class. */ private MemoryInformationData memoryInformationData = new MemoryInformationData(); /** The {@link MemoryInfoProvider} used to retrieve heap memory information. */ private MemoryInfoProvider memoryBean; /** The {@link OperatingSystemInfoProvider} used to retrieve physical memory information. */ private OperatingSystemInfoProvider osBean; /** * {@inheritDoc} */ @Override public void gather() { // The timestamp is set in the {@link MemoryInformation#reset()} to avoid multiple renewal. // It will not be set on the first execution of {@link MemoryInformation#gather()}, but // shortly before. long freePhysMemory = this.getOsBean().getFreePhysicalMemorySize(); long freeSwapSpace = this.getOsBean().getFreeSwapSpaceSize(); long comittedVirtualMemSize = this.getOsBean().getCommittedVirtualMemorySize(); long usedHeapMemorySize = this.getMemoryBean().getHeapMemoryUsage().getUsed(); long comittedHeapMemorySize = this.getMemoryBean().getHeapMemoryUsage().getCommitted(); long usedNonHeapMemorySize = this.getMemoryBean().getNonHeapMemoryUsage().getUsed(); long comittedNonHeapMemorySize = this.getMemoryBean().getNonHeapMemoryUsage().getCommitted(); this.memoryInformationData.incrementCount(); this.memoryInformationData.addFreePhysMemory(freePhysMemory); this.memoryInformationData.addFreeSwapSpace(freeSwapSpace); this.memoryInformationData.addComittedVirtualMemSize(comittedVirtualMemSize); this.memoryInformationData.addUsedHeapMemorySize(usedHeapMemorySize); this.memoryInformationData.addComittedHeapMemorySize(comittedHeapMemorySize); this.memoryInformationData.addUsedNonHeapMemorySize(usedNonHeapMemorySize); this.memoryInformationData.addComittedNonHeapMemorySize(comittedNonHeapMemorySize); if (freePhysMemory < this.memoryInformationData.getMinFreePhysMemory()) { this.memoryInformationData.setMinFreePhysMemory(freePhysMemory); } else if (freePhysMemory > this.memoryInformationData.getMaxFreePhysMemory()) { this.memoryInformationData.setMaxFreePhysMemory(freePhysMemory); } if (freeSwapSpace < this.memoryInformationData.getMinFreeSwapSpace()) { this.memoryInformationData.setMinFreeSwapSpace(freeSwapSpace); } else if (freeSwapSpace > this.memoryInformationData.getMaxFreeSwapSpace()) { this.memoryInformationData.setMaxFreeSwapSpace(freeSwapSpace); } if (comittedVirtualMemSize < this.memoryInformationData.getMinComittedVirtualMemSize()) { this.memoryInformationData.setMinComittedVirtualMemSize(comittedVirtualMemSize); } else if (comittedVirtualMemSize > this.memoryInformationData.getMaxComittedVirtualMemSize()) { this.memoryInformationData.setMaxComittedVirtualMemSize(comittedVirtualMemSize); } if (usedHeapMemorySize < this.memoryInformationData.getMinUsedHeapMemorySize()) { this.memoryInformationData.setMinUsedHeapMemorySize(usedHeapMemorySize); } else if (usedHeapMemorySize > this.memoryInformationData.getMaxUsedHeapMemorySize()) { this.memoryInformationData.setMaxUsedHeapMemorySize(usedHeapMemorySize); } if (comittedHeapMemorySize < this.memoryInformationData.getMinComittedHeapMemorySize()) { this.memoryInformationData.setMinComittedHeapMemorySize(comittedHeapMemorySize); } else if (comittedHeapMemorySize > this.memoryInformationData.getMaxComittedHeapMemorySize()) { this.memoryInformationData.setMaxComittedHeapMemorySize(comittedHeapMemorySize); } if (usedNonHeapMemorySize < this.memoryInformationData.getMinUsedNonHeapMemorySize()) { this.memoryInformationData.setMinUsedNonHeapMemorySize(usedNonHeapMemorySize); } else if (usedNonHeapMemorySize > this.memoryInformationData.getMaxUsedNonHeapMemorySize()) { this.memoryInformationData.setMaxUsedNonHeapMemorySize(usedNonHeapMemorySize); } if (comittedNonHeapMemorySize < this.memoryInformationData.getMinComittedNonHeapMemorySize()) { this.memoryInformationData.setMinComittedNonHeapMemorySize(comittedNonHeapMemorySize); } else if (comittedNonHeapMemorySize > this.memoryInformationData.getMaxComittedNonHeapMemorySize()) { this.memoryInformationData.setMaxComittedNonHeapMemorySize(comittedNonHeapMemorySize); } } /** * {@inheritDoc} */ @Override public SystemSensorData get() { MemoryInformationData newMemoryInformationData = new MemoryInformationData(); newMemoryInformationData.setPlatformIdent(this.memoryInformationData.getPlatformIdent()); newMemoryInformationData.setSensorTypeIdent(this.memoryInformationData.getSensorTypeIdent()); newMemoryInformationData.setCount(this.memoryInformationData.getCount()); newMemoryInformationData.setTotalFreePhysMemory(this.memoryInformationData.getTotalFreePhysMemory()); newMemoryInformationData.setMinFreePhysMemory(this.memoryInformationData.getMinFreePhysMemory()); newMemoryInformationData.setMaxFreePhysMemory(this.memoryInformationData.getMaxFreePhysMemory()); newMemoryInformationData.setTotalFreeSwapSpace(this.memoryInformationData.getTotalFreeSwapSpace()); newMemoryInformationData.setMinFreeSwapSpace(this.memoryInformationData.getMinFreeSwapSpace()); newMemoryInformationData.setMaxFreeSwapSpace(this.memoryInformationData.getMaxFreeSwapSpace()); newMemoryInformationData.setTotalComittedVirtualMemSize(this.memoryInformationData.getTotalComittedVirtualMemSize()); newMemoryInformationData.setMinComittedVirtualMemSize(this.memoryInformationData.getMinComittedVirtualMemSize()); newMemoryInformationData.setMaxComittedVirtualMemSize(this.memoryInformationData.getMaxComittedVirtualMemSize()); newMemoryInformationData.setTotalUsedHeapMemorySize(this.memoryInformationData.getTotalUsedHeapMemorySize()); newMemoryInformationData.setMinUsedHeapMemorySize(this.memoryInformationData.getMinUsedHeapMemorySize()); newMemoryInformationData.setMaxUsedHeapMemorySize(this.memoryInformationData.getMaxUsedHeapMemorySize()); newMemoryInformationData.setTotalComittedHeapMemorySize(this.memoryInformationData.getTotalComittedHeapMemorySize()); newMemoryInformationData.setMinComittedHeapMemorySize(this.memoryInformationData.getMinComittedHeapMemorySize()); newMemoryInformationData.setMaxComittedHeapMemorySize(this.memoryInformationData.getMaxComittedHeapMemorySize()); newMemoryInformationData.setTotalUsedNonHeapMemorySize(this.memoryInformationData.getTotalUsedNonHeapMemorySize()); newMemoryInformationData.setMinUsedNonHeapMemorySize(this.memoryInformationData.getMinUsedNonHeapMemorySize()); newMemoryInformationData.setMaxUsedNonHeapMemorySize(this.memoryInformationData.getMaxUsedNonHeapMemorySize()); newMemoryInformationData.setMinComittedNonHeapMemorySize(this.memoryInformationData.getMinComittedNonHeapMemorySize()); newMemoryInformationData.setMaxComittedNonHeapMemorySize(this.memoryInformationData.getMaxComittedNonHeapMemorySize()); newMemoryInformationData.setTotalComittedNonHeapMemorySize(this.memoryInformationData.getTotalComittedNonHeapMemorySize()); newMemoryInformationData.setTimeStamp(this.memoryInformationData.getTimeStamp()); return newMemoryInformationData; } /** * {@inheritDoc} */ @Override public void reset() { this.memoryInformationData.setCount(0); this.memoryInformationData.setTotalFreePhysMemory(0L); this.memoryInformationData.setMinFreePhysMemory(Long.MAX_VALUE); this.memoryInformationData.setMaxFreePhysMemory(0L); this.memoryInformationData.setTotalFreeSwapSpace(0L); this.memoryInformationData.setMinFreeSwapSpace(Long.MAX_VALUE); this.memoryInformationData.setMaxFreeSwapSpace(0L); this.memoryInformationData.setTotalComittedVirtualMemSize(0L); this.memoryInformationData.setMinComittedVirtualMemSize(Long.MAX_VALUE); this.memoryInformationData.setMaxComittedVirtualMemSize(0L); this.memoryInformationData.setTotalUsedHeapMemorySize(0L); this.memoryInformationData.setMinUsedHeapMemorySize(Long.MAX_VALUE); this.memoryInformationData.setMaxUsedHeapMemorySize(0L); this.memoryInformationData.setTotalComittedHeapMemorySize(0L); this.memoryInformationData.setMinComittedHeapMemorySize(Long.MAX_VALUE); this.memoryInformationData.setMaxComittedHeapMemorySize(0L); this.memoryInformationData.setTotalUsedNonHeapMemorySize(0L); this.memoryInformationData.setMinUsedNonHeapMemorySize(Long.MAX_VALUE); this.memoryInformationData.setMaxUsedNonHeapMemorySize(0L); this.memoryInformationData.setTotalComittedNonHeapMemorySize(0L); this.memoryInformationData.setMinComittedNonHeapMemorySize(Long.MAX_VALUE); this.memoryInformationData.setMaxComittedNonHeapMemorySize(0L); Timestamp timestamp = new Timestamp(Calendar.getInstance().getTimeInMillis()); this.memoryInformationData.setTimeStamp(timestamp); } /** * {@inheritDoc} */ @Override protected SystemSensorData getSystemSensorData() { return this.memoryInformationData; } /** * Gets the {@link OperatingSystemInfoProvider}. The getter method is provided for better * testability. * * @return {@link OperatingSystemInfoProvider}. */ private OperatingSystemInfoProvider getOsBean() { if (this.osBean == null) { this.osBean = PlatformSensorInfoProviderFactory.getPlatformSensorInfoProvider().getOperatingSystemInfoProvider(); } return this.osBean; } /** * Gets the {@link MemoryInfoProvider}. The getter method is provided for better testability. * * @return {@link MemoryInfoProvider}. */ private MemoryInfoProvider getMemoryBean() { if (this.memoryBean == null) { this.memoryBean = PlatformSensorInfoProviderFactory.getPlatformSensorInfoProvider().getMemoryInfoProvider(); } return this.memoryBean; } }