001/*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2015
005 * Space Science and Engineering Center (SSEC)
006 * University of Wisconsin - Madison
007 * 1225 W. Dayton Street, Madison, WI 53706, USA
008 * https://www.ssec.wisc.edu/mcidas
009 * 
010 * All Rights Reserved
011 * 
012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013 * some McIDAS-V source code is based on IDV and VisAD source code.  
014 * 
015 * McIDAS-V is free software; you can redistribute it and/or modify
016 * it under the terms of the GNU Lesser Public License as published by
017 * the Free Software Foundation; either version 3 of the License, or
018 * (at your option) any later version.
019 * 
020 * McIDAS-V is distributed in the hope that it will be useful,
021 * but WITHOUT ANY WARRANTY; without even the implied warranty of
022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
023 * GNU Lesser Public License for more details.
024 * 
025 * You should have received a copy of the GNU Lesser Public License
026 * along with this program.  If not, see http://www.gnu.org/licenses.
027 */
028
029package edu.wisc.ssec.mcidasv.util;
030
031import java.lang.management.ManagementFactory;
032import java.lang.management.OperatingSystemMXBean;
033import java.lang.reflect.Method;
034
035/**
036 * Wrapper for OperatingSystemMXBean
037 */
038public class GetMem {
039
040    /**
041     * Call a method belonging to {@link OperatingSystemMXBean} and return 
042     * the result. 
043     * 
044     * @param <T> Type of the expected return and {@code defaultValue}.
045     * @param methodName Name of the {@code OperatingSystemMXBean} method to call. Cannot be {@code null} or empty.
046     * @param defaultValue Value to return if the call to {@code methodName} fails.
047     * 
048     * @return Either the value returned by the {@code methodName} call, or {@code defaultValue}.
049     */
050    private <T> T callMXBeanMethod(final String methodName, final T defaultValue) {
051        assert methodName != null : "Cannot invoke a null method name";
052        assert methodName.length() > 0: "Cannot invoke an empty method name";
053        OperatingSystemMXBean osBean = 
054            ManagementFactory.getOperatingSystemMXBean();
055        T result = defaultValue;
056        try {
057            Method m = osBean.getClass().getMethod(methodName);
058            m.setAccessible(true);
059            // don't suppress warnings because we cannot guarantee that this
060            // cast is correct.
061            result = (T)m.invoke(osBean);
062        } catch (Exception e) {
063            System.err.println("Error invoking OperatingSystemMXBean method: " + methodName);
064            // do nothing for right now
065        }
066        return result;
067    }
068
069    /**
070     * Get total system memory and print it out--accounts for 32bit JRE 
071     * limitation of 1.5GB.
072     * 
073     * @return {@code String} representation of the total amount of system 
074     * memory. 
075     * 
076     * @throws Exception
077     */
078    public static String getMemory() throws Exception {
079        GetMem nonStaticInstance = new GetMem();
080        Object totalMemoryObject = nonStaticInstance.callMXBeanMethod("getTotalPhysicalMemorySize", 0);
081        long totalMemory = ((Number)totalMemoryObject).longValue();
082        boolean is64 = (System.getProperty("os.arch").indexOf("64") >= 0);
083        int megabytes = (int)(Math.round(totalMemory/1024/1024));
084        if (!is64 && megabytes > 1536) {
085            megabytes = 1536;
086        }
087        return String.valueOf(megabytes);
088    }
089
090    /**
091     * The main. Get total system memory and print it out.
092     * 
093     * @param args Ignored.
094     */
095    public static void main(String[] args) {
096        try {
097            System.out.println(getMemory());
098        } catch (Exception e) {
099            System.err.println("Error getting total physical memory size");
100            System.out.println("0");
101        }
102    }
103}