同事前些日子去景德镇某客户那里布测试环境,几个人点系统就出现非堆内存溢出的情况,而且同事反映,他已经对tomcat进行优化了,但是仍然无济于事。
后来回公司重现了现场的错误,是因为他把tomcat加到windows服务列表中,而优化的参数写在catalina.bat中,优化没有生效。
jvisualvm.exe是jdk提供的一款jvm监控软件,能够查看jvm启动的参数和各类内存的使用状况,在JDK6.0update7后自带,可是同事不会使
我就想在自己系统里也加一个这个功能,只简单的显示一些参数信息,用到了java.lang.management.*这个包下的内容。
定义获取的信息bean
import java.lang.management.MemoryUsage;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.builder.ToStringBuilder;
/**
* @author lisen
* @date 2013-11-22 上午09:23:30
*/
public class SystemInfoBean {
// 加载类的数量
private int loadClazzCount;
// 已经加载类的数量
private long hasloadClazzCount;
// 尚未加载类的数量
private long hasUnloadClazzCount;
// 堆内存信息
private MemoryUsage heapMemoryUsage;
// 非堆内存信息
private MemoryUsage nonHeapMemoryUsage;
// 操作系统的名称
private String operateName;
// 操作系统的进程数
private int processListCount;
// 操作系统的架构
private String archName;
// 操作系统的版本号码
private String versionName;
// 虚拟机的名称
private String vmName;
// 虚拟机的版本
private String vmVersion;
// 系统的供应商的名称
private String vmVendor;
// JVM启动时间
private Date startTime;
// 输入参数
private List<String> arguments;
// 系统参数
private Map<String, String> systemProperties;
//setter and getter...
}
获取信息的工具类
import java.lang.management.ClassLoadingMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean;
import java.util.Date;
/**
* @author lisen
* @date 2013-11-22 上午09:27:03
*/
public class SystemInfoUtils {
private SystemInfoBean infoBean = null;
private static class SingletonClassInstance {
private static final SystemInfoUtils instance = new SystemInfoUtils();
}
public static SystemInfoUtils getInstance() {
return SingletonClassInstance.instance;
}
private SystemInfoUtils() {
infoBean = new SystemInfoBean();
// 操作系统信息
OperatingSystemMXBean operateSystemMBean = ManagementFactory
.getOperatingSystemMXBean();
String operateName = operateSystemMBean.getName();
infoBean.setOperateName(operateName);
int processListCount = operateSystemMBean.getAvailableProcessors();
infoBean.setProcessListCount(processListCount);
String archName = operateSystemMBean.getArch();// System.getProperty("os.arch");
infoBean.setArchName(archName);
String versionName = operateSystemMBean.getVersion();// System.getProperty("os.version");
infoBean.setVersionName(versionName);
// 运行时信息
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
String vmName = runtimeMXBean.getVmName();
infoBean.setVmName(vmName);
String vmVersion = runtimeMXBean.getVmVersion();
// infoBean.setVmVersion(vmVersion);
infoBean.setVmVersion(System.getProperty("java.version") + " ("
+ vmVersion + ")");
String vmVendor = runtimeMXBean.getVmVendor();
infoBean.setVmVendor(vmVendor);
long startTime = runtimeMXBean.getStartTime();
infoBean.setStartTime(new Date(startTime));
infoBean.setArguments(runtimeMXBean.getInputArguments());
infoBean.setSystemProperties(runtimeMXBean.getSystemProperties());
}
public SystemInfoBean getSystemInfo() {
// 类信息
ClassLoadingMXBean classLoadMXBean = ManagementFactory
.getClassLoadingMXBean();
int loadClazzCount = classLoadMXBean.getLoadedClassCount();
infoBean.setLoadClazzCount(loadClazzCount);
long hasloadClazzCount = classLoadMXBean.getTotalLoadedClassCount();
infoBean.setHasloadClazzCount(hasloadClazzCount);
long hasUnloadClazzCount = classLoadMXBean.getUnloadedClassCount();
infoBean.setHasUnloadClazzCount(hasUnloadClazzCount);
// 内存
MemoryMXBean memoryUsage = ManagementFactory.getMemoryMXBean();
infoBean.setHeapMemoryUsage(memoryUsage.getHeapMemoryUsage());
infoBean.setNonHeapMemoryUsage(memoryUsage.getNonHeapMemoryUsage());
return infoBean;
}
}
效果图
参考http://blog.csdn.net/zhongweijian/article/details/7619383