| /** |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.activemq.tool; |
| |
| import java.io.DataOutputStream; |
| import java.lang.management.ManagementFactory; |
| import java.lang.management.MemoryMXBean; |
| import java.util.Properties; |
| import java.util.concurrent.atomic.AtomicBoolean; |
| |
| public class MemoryMonitoringTool implements Runnable { |
| |
| protected Properties testSettings = new Properties(); |
| protected ReportGenerator reportGenerator = new ReportGenerator(); |
| |
| private long checkpointInterval = 5000; // 5 sec sample checkpointInterval |
| private long resultIndex; |
| private AtomicBoolean isRunning = new AtomicBoolean(false); |
| private DataOutputStream dataDoutputStream; |
| private MemoryMXBean memoryBean; |
| |
| public Properties getTestSettings() { |
| return testSettings; |
| } |
| |
| public void setTestSettings(Properties sysTestSettings) { |
| this.testSettings = sysTestSettings; |
| } |
| |
| public DataOutputStream getDataOutputStream() { |
| return dataDoutputStream; |
| } |
| |
| public void setDataOutputStream(DataOutputStream dataDoutputStream) { |
| this.dataDoutputStream = dataDoutputStream; |
| } |
| |
| |
| public void stopMonitor() { |
| isRunning.set(false); |
| } |
| |
| |
| public long getCheckpointInterval() { |
| return checkpointInterval; |
| } |
| |
| public void setCheckpointInterval(long checkpointInterval) { |
| this.checkpointInterval = checkpointInterval; |
| } |
| |
| |
| public Thread startMonitor() { |
| |
| String intervalStr = this.getTestSettings().getProperty("checkpoint_interval"); |
| checkpointInterval = new Integer(intervalStr).intValue(); |
| this.getTestSettings().remove("checkpoint_interval"); |
| |
| memoryBean = ManagementFactory.getMemoryMXBean(); |
| reportGenerator.setTestSettings(getTestSettings()); |
| addTestInformation(); |
| |
| Thread t = new Thread(this); |
| t.setName("Memory monitoring tool"); |
| isRunning.set(true); |
| t.start(); |
| |
| return t; |
| |
| } |
| |
| |
| public void addTestInformation() { |
| reportGenerator.setReportName(this.getTestSettings().getProperty("report_name")); |
| reportGenerator.setReportDirectory(this.getTestSettings().getProperty("report_directory")); |
| reportGenerator.startGenerateReport(); |
| |
| reportGenerator.addTestInformation(); |
| reportGenerator.writeWithIndent(4, "<jvm_memory_settings>"); |
| reportGenerator.writeWithIndent(6, "<heap_memory>"); |
| reportGenerator.writeWithIndent(8, "<committed>" + memoryBean.getHeapMemoryUsage().getCommitted() + "</committed>"); |
| reportGenerator.writeWithIndent(8, "<max>" + memoryBean.getHeapMemoryUsage().getMax() + "</max>"); |
| reportGenerator.writeWithIndent(6, "</heap_memory>"); |
| reportGenerator.writeWithIndent(6, "<non_heap_memory>"); |
| reportGenerator.writeWithIndent(8, "<committed>" + memoryBean.getNonHeapMemoryUsage().getCommitted() + "</committed>"); |
| reportGenerator.writeWithIndent(8, "<max>" + memoryBean.getNonHeapMemoryUsage().getMax() + "</max>"); |
| reportGenerator.writeWithIndent(6, "</non_heap_memory>"); |
| reportGenerator.writeWithIndent(4, "</jvm_memory_settings>"); |
| |
| reportGenerator.addClientSettings(); |
| reportGenerator.endTestInformation(); |
| } |
| |
| |
| public void run() { |
| |
| long nonHeapMB = 0; |
| long heapMB = 0; |
| long oneMB = 1024 * 1024; |
| |
| reportGenerator.startTestResult(getCheckpointInterval()); |
| while (isRunning.get()) { |
| |
| try { |
| //wait every check point before getting the next memory usage |
| Thread.sleep(checkpointInterval); |
| |
| nonHeapMB = memoryBean.getNonHeapMemoryUsage().getUsed() / oneMB; |
| heapMB = memoryBean.getHeapMemoryUsage().getUsed() / oneMB; |
| |
| reportGenerator.writeWithIndent(6, "<memory_usage index='" + resultIndex |
| + "' non_heap_mb='" + nonHeapMB |
| + "' non_heap_bytes='" |
| + memoryBean.getNonHeapMemoryUsage().getUsed() |
| + "' heap_mb='" + heapMB |
| + "' heap_bytes='" + memoryBean.getHeapMemoryUsage().getUsed() + "'/>"); |
| |
| resultIndex++; |
| |
| } catch (Exception e) { |
| e.printStackTrace(); |
| |
| } |
| |
| |
| } |
| reportGenerator.endTestResult(); |
| reportGenerator.stopGenerateReport(); |
| |
| } |
| |
| |
| } |