/**
* Copyright (C) 2010 Peter Karich <jetwick_@_pannous_._info>
*
* Licensed 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 de.jetwick.util;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.RuntimeMXBean;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
/**
*
* @author Peter Karich, peat_hal 'at' users 'dot' sourceforge 'dot' net
*/
public class PermGenDetect {
String name;
public static void main(String[] args) throws Exception {
PermGenDetect app = new PermGenDetect("SimpleMain");
// add to catalina.sh
// -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9347 -Dcom.sun.management.jmxremote.authenticate=true \
// -Dcom.sun.management.jmxremote.ssl=false \
// -Dcom.sun.management.jmxremote.password.file=tomcatinstall/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=tomcatinstall/conf/jmxremote.access"
if (args.length == 0)
app.memoryUsage("service:jmx:rmi:///jndi/rmi://81.169.187.238:9347/jmxrmi", false);
else
app.memoryUsage(args[0], Boolean.parseBoolean(args[1]));
}
public PermGenDetect(String name) {
this.name = name;
}
public void memoryUsage(String url, boolean details) throws Exception {
memoryUsage(new JMXServiceURL(url), details);
}
// find jmx connection http://blogs.sun.com/jmxetc/entry/how_to_retrieve_remote_jvm
public void memoryUsage(JMXServiceURL target, boolean details) throws Exception {
Map<String, Object> env = new LinkedHashMap<String, Object>();
String[] creds = {"monitorRole", "diff4%&pw"};
env.put(JMXConnector.CREDENTIALS, creds);
final JMXConnector connector = JMXConnectorFactory.connect(target, env);
final MBeanServerConnection remote = connector.getMBeanServerConnection();
final MemoryMXBean memoryBean = ManagementFactory.newPlatformMXBeanProxy(
remote, ManagementFactory.MEMORY_MXBEAN_NAME, MemoryMXBean.class);
long MB = 1024 * 1024;
long free = (memoryBean.getNonHeapMemoryUsage().getMax() - memoryBean.getNonHeapMemoryUsage().getUsed()) / MB;
System.out.println(free);
if (details) {
RuntimeMXBean remoteRuntime = ManagementFactory.newPlatformMXBeanProxy(
remote,
ManagementFactory.RUNTIME_MXBEAN_NAME,
RuntimeMXBean.class);
System.out.println("Target VM is: " + remoteRuntime.getName());
System.out.println("VM version: " + remoteRuntime.getVmVersion());
System.out.println("VM vendor: " + remoteRuntime.getVmVendor());
System.out.println("Started since: " + remoteRuntime.getUptime());
System.out.println("With Classpath: " + remoteRuntime.getClassPath());
System.out.println("And args: " + remoteRuntime.getInputArguments() + "\n");
System.out.println("---Memory Usage--- " + new Date());
System.out.println("Committed Perm Gen:" + memoryBean.getNonHeapMemoryUsage().getCommitted());
System.out.println("init Perm Gen :" + memoryBean.getNonHeapMemoryUsage().getInit());
System.out.println("max Perm Gen :" + memoryBean.getNonHeapMemoryUsage().getMax());
System.out.println("Used Perm Gen :" + memoryBean.getNonHeapMemoryUsage().getUsed() + "\n");
for (MemoryPoolMXBean mb : ManagementFactory.getMemoryPoolMXBeans()) {
System.out.println("\n" + mb.getName());
System.out.println(mb.getType().toString());
if (mb.getCollectionUsage() != null)
System.out.println("coll max:" + mb.getCollectionUsage().getMax());
System.out.println("committed:" + mb.getUsage().getCommitted());
System.out.println("init:" + mb.getUsage().getInit());
System.out.println("max :" + mb.getUsage().getMax());
System.out.println("used:" + mb.getUsage().getUsed());
}
}
connector.close();
}
}