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    }