/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
*/
package org.opends.server.util;
import static org.opends.server.loggers.ErrorLogger.logError;
import static org.opends.messages.RuntimeMessages.*;
import static org.opends.messages.CoreMessages.*;
import static org.opends.server.util.DynamicConstants.*;
import org.opends.server.core.DirectoryServer;
import java.net.InetAddress;
import java.io.File;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ManagementFactory;
import java.util.List;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import com.sleepycat.je.JEVersion;
/**
* This class is used to gather and display information from the runtime
* environment.
*/
public class RuntimeInformation {
private static boolean is64Bit=false;
static {
String arch = System.getProperty("sun.arch.data.model");
if (arch != null) {
try {
is64Bit = Integer.parseInt(arch) == 64;
} catch (NumberFormatException ex) {
//Default to 32 bit.
}
}
}
/**
* Returns whether the architecture of the JVM we are running under is 64-bit
* or not.
*
* @return <CODE>true</CODE> if the JVM architecture we running under is
* 64-bit and <CODE>false</CODE> otherwise.
*/
public static boolean is64Bit() {
return is64Bit;
}
/**
* Returns a string representing the JVM input arguments as determined by the
* MX runtime bean. The individual arguments are separated by commas.
*
* @return A string representation of the JVM input arguments.
*/
private static String getInputArguments() {
int count=0;
RuntimeMXBean rtBean = ManagementFactory.getRuntimeMXBean();
StringBuilder argList = new StringBuilder();
List<String> jvmArguments = rtBean.getInputArguments();
if ((jvmArguments != null) && (! jvmArguments.isEmpty())) {
for (String jvmArg : jvmArguments) {
if (argList.length() > 0) {
argList.append(" ");
}
argList.append("\"");
argList.append(jvmArg);
argList.append("\"");
count++;
if (count < jvmArguments.size()) {
argList.append(",");
}
}
}
return argList.toString();
}
/**
* Writes runtime information to a print stream.
*/
public static void printInfo() {
System.out.println(NOTE_VERSION.get(DirectoryServer.getVersionString()));
System.out.println(NOTE_BUILD_ID.get(BUILD_ID));
System.out.println(
NOTE_JAVA_VERSION.get(System.getProperty("java.version")));
System.out.println(
NOTE_JAVA_VENDOR.get(System.getProperty("java.vendor")));
System.out.println(
NOTE_JVM_VERSION.get(System.getProperty("java.vm.version")));
System.out.println(
NOTE_JVM_VENDOR.get(System.getProperty("java.vm.vendor")));
System.out.println(
NOTE_JAVA_HOME.get(System.getProperty("java.home")));
System.out.println(
NOTE_JAVA_CLASSPATH.get(System.getProperty("java.class.path")));
System.out.println(
NOTE_JE_VERSION.get(JEVersion.CURRENT_VERSION.toString()));
System.out.println(
NOTE_CURRENT_DIRECTORY.get(System.getProperty("user.dir")));
String installDir = DirectoryServer.getServerRoot();
try
{
installDir = new File(installDir).getCanonicalPath();
}
catch (Exception e){}
if (installDir == null)
{
System.out.println(NOTE_UNKNOWN_INSTALL_DIRECTORY.get());
}
else
{
System.out.println(NOTE_INSTALL_DIRECTORY.get(installDir));
}
String instanceDir = DirectoryServer.getInstanceRoot();
try
{
instanceDir = new File(instanceDir).getCanonicalPath();
}
catch (Exception e){}
if (instanceDir == null)
{
System.out.println(NOTE_UNKNOWN_INSTANCE_DIRECTORY.get());
}
else
{
System.out.println(NOTE_INSTANCE_DIRECTORY.get(instanceDir));
}
System.out.println(
NOTE_OPERATING_SYSTEM.get(System.getProperty("os.name") + " " +
System.getProperty("os.version") + " " +
System.getProperty("os.arch")));
String sunOsArchDataModel = System.getProperty("sun.arch.data.model");
if (sunOsArchDataModel != null) {
if (! sunOsArchDataModel.toLowerCase().equals("unknown")) {
System.out.println(NOTE_JVM_ARCH.get(sunOsArchDataModel + "-bit"));
}
}
else{
System.out.println(NOTE_JVM_ARCH.get("unknown"));
}
try {
System.out.println(NOTE_SYSTEM_NAME.get(InetAddress.getLocalHost().
getCanonicalHostName()));
}
catch (Exception e) {
System.out.println(NOTE_SYSTEM_NAME.get("Unknown (" + e + ")"));
}
System.out.println(NOTE_AVAILABLE_PROCESSORS.get(Runtime.getRuntime().
availableProcessors()));
System.out.println(NOTE_MAX_MEMORY.get(Runtime.getRuntime().maxMemory()));
System.out.println(
NOTE_TOTAL_MEMORY.get(Runtime.getRuntime().totalMemory()));
System.out.println(
NOTE_FREE_MEMORY.get(Runtime.getRuntime().freeMemory()));
}
/**
* Returns the physical memory size, in bytes, of the hardware we are
* running on.
*
* @return Bytes of physical memory of the hardware we are running on.
*/
private static long getPhysicalMemorySize()
{
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
try
{
// Assuming the RuntimeMXBean has been registered in mbs
ObjectName oname = new ObjectName(
ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME);
// Check if this MXBean contains Sun's extension
if (mbs.isInstanceOf(oname, "com.sun.management.OperatingSystemMXBean")) {
// Get platform-specific attribute "TotalPhysicalMemorySize"
Long l = (Long) mbs.getAttribute(oname, "TotalPhysicalMemorySize");
return l ;
}
else
{
return -1;
}
}
catch (Exception e)
{
return -1;
}
}
/**
* Returns a string representing the fully qualified domain name.
*
* @return A string representing the fully qualified domain name or the
* string "unknown" if an exception was thrown.
*/
private static String getHostName() {
String host;
try {
host=InetAddress.getLocalHost().getCanonicalHostName();
}
catch (Exception e) {
host="Unknown (" + e + ")";
}
return host;
}
/**
* Returns string representing operating system name,
* version and architecture.
*
* @return String representing the operating system information the JVM is
* running under.
*/
private static String getOSInfo() {
return System.getProperty("os.name") + " " +
System.getProperty("os.version") + " " +
System.getProperty("os.arch");
}
/**
* Return string representing the architecture of the JVM we are running
* under.
*
* @return A string representing the architecture of the JVM we are running
* under or "unknown" if the architecture cannot be determined.
*/
private static String getArch() {
String sunOsArchDataModel = System.getProperty("sun.arch.data.model");
if (sunOsArchDataModel != null) {
if (! sunOsArchDataModel.toLowerCase().equals("unknown")) {
return (sunOsArchDataModel + "-bit");
}
}
return "unknown";
}
/**
* Write runtime information to error log.
*/
public static void logInfo() {
String installDir = DirectoryServer.getServerRoot();
try
{
installDir = new File(installDir).getCanonicalPath();
}
catch (Exception e){}
if (installDir == null)
{
logError(NOTE_UNKNOWN_INSTALL_DIRECTORY.get());
}
else
{
logError(NOTE_INSTALL_DIRECTORY.get(installDir));
}
String instanceDir = DirectoryServer.getInstanceRoot();
try
{
instanceDir = new File(instanceDir).getCanonicalPath();
}
catch (Exception e){}
if (instanceDir == null)
{
logError(NOTE_UNKNOWN_INSTANCE_DIRECTORY.get());
}
else
{
logError(NOTE_INSTANCE_DIRECTORY.get(instanceDir));
}
logError(NOTE_JVM_INFO.get(System.getProperty("java.runtime.version"),
System.getProperty("java.vendor"),
getArch(),Runtime.getRuntime().maxMemory()));
Long physicalMemorySize = getPhysicalMemorySize();
if (physicalMemorySize != -1)
{
logError(NOTE_JVM_HOST.get(getHostName(), getOSInfo(),
physicalMemorySize, Runtime.getRuntime().availableProcessors()));
}
else
{
logError(NOTE_JVM_HOST_WITH_UNKNOWN_PHYSICAL_MEM.get(getHostName(),
getOSInfo(), Runtime.getRuntime().availableProcessors()));
}
logError(NOTE_JVM_ARGS.get(getInputArguments()));
}
}