001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.activemq.tool; 018 019 import java.io.DataOutputStream; 020 import java.lang.management.ManagementFactory; 021 import java.lang.management.MemoryMXBean; 022 import java.util.Properties; 023 import java.util.concurrent.atomic.AtomicBoolean; 024 025 public class MemoryMonitoringTool implements Runnable { 026 027 protected Properties testSettings = new Properties(); 028 protected ReportGenerator reportGenerator = new ReportGenerator(); 029 030 private long checkpointInterval = 5000; // 5 sec sample checkpointInterval 031 private long resultIndex; 032 private AtomicBoolean isRunning = new AtomicBoolean(false); 033 private DataOutputStream dataDoutputStream; 034 private MemoryMXBean memoryBean; 035 036 public Properties getTestSettings() { 037 return testSettings; 038 } 039 040 public void setTestSettings(Properties sysTestSettings) { 041 this.testSettings = sysTestSettings; 042 } 043 044 public DataOutputStream getDataOutputStream() { 045 return dataDoutputStream; 046 } 047 048 public void setDataOutputStream(DataOutputStream dataDoutputStream) { 049 this.dataDoutputStream = dataDoutputStream; 050 } 051 052 053 public void stopMonitor() { 054 isRunning.set(false); 055 } 056 057 058 public long getCheckpointInterval() { 059 return checkpointInterval; 060 } 061 062 public void setCheckpointInterval(long checkpointInterval) { 063 this.checkpointInterval = checkpointInterval; 064 } 065 066 067 public Thread startMonitor() { 068 069 String intervalStr = this.getTestSettings().getProperty("checkpoint_interval"); 070 checkpointInterval = new Integer(intervalStr).intValue(); 071 this.getTestSettings().remove("checkpoint_interval"); 072 073 memoryBean = ManagementFactory.getMemoryMXBean(); 074 reportGenerator.setTestSettings(getTestSettings()); 075 addTestInformation(); 076 077 Thread t = new Thread(this); 078 t.setName("Memory monitoring tool"); 079 isRunning.set(true); 080 t.start(); 081 082 return t; 083 084 } 085 086 087 public void addTestInformation() { 088 reportGenerator.setReportName(this.getTestSettings().getProperty("report_name")); 089 reportGenerator.setReportDirectory(this.getTestSettings().getProperty("report_directory")); 090 reportGenerator.startGenerateReport(); 091 092 reportGenerator.addTestInformation(); 093 reportGenerator.writeWithIndent(4, "<jvm_memory_settings>"); 094 reportGenerator.writeWithIndent(6, "<heap_memory>"); 095 reportGenerator.writeWithIndent(8, "<committed>" + memoryBean.getHeapMemoryUsage().getCommitted() + "</committed>"); 096 reportGenerator.writeWithIndent(8, "<max>" + memoryBean.getHeapMemoryUsage().getMax() + "</max>"); 097 reportGenerator.writeWithIndent(6, "</heap_memory>"); 098 reportGenerator.writeWithIndent(6, "<non_heap_memory>"); 099 reportGenerator.writeWithIndent(8, "<committed>" + memoryBean.getNonHeapMemoryUsage().getCommitted() + "</committed>"); 100 reportGenerator.writeWithIndent(8, "<max>" + memoryBean.getNonHeapMemoryUsage().getMax() + "</max>"); 101 reportGenerator.writeWithIndent(6, "</non_heap_memory>"); 102 reportGenerator.writeWithIndent(4, "</jvm_memory_settings>"); 103 104 reportGenerator.addClientSettings(); 105 reportGenerator.endTestInformation(); 106 } 107 108 109 public void run() { 110 111 long nonHeapMB = 0; 112 long heapMB = 0; 113 long oneMB = 1024 * 1024; 114 115 reportGenerator.startTestResult(getCheckpointInterval()); 116 while (isRunning.get()) { 117 118 try { 119 //wait every check point before getting the next memory usage 120 Thread.sleep(checkpointInterval); 121 122 nonHeapMB = memoryBean.getNonHeapMemoryUsage().getUsed() / oneMB; 123 heapMB = memoryBean.getHeapMemoryUsage().getUsed() / oneMB; 124 125 reportGenerator.writeWithIndent(6, "<memory_usage index='" + resultIndex 126 + "' non_heap_mb='" + nonHeapMB 127 + "' non_heap_bytes='" 128 + memoryBean.getNonHeapMemoryUsage().getUsed() 129 + "' heap_mb='" + heapMB 130 + "' heap_bytes='" + memoryBean.getHeapMemoryUsage().getUsed() + "'/>"); 131 132 resultIndex++; 133 134 } catch (Exception e) { 135 e.printStackTrace(); 136 137 } 138 139 140 } 141 reportGenerator.endTestResult(); 142 reportGenerator.stopGenerateReport(); 143 144 } 145 146 147 }