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