LinuxMemoryCalculatorPlugin.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.util;
  19. import java.io.BufferedReader;
  20. import java.io.FileNotFoundException;
  21. import java.io.FileReader;
  22. import java.io.IOException;
  23. import java.util.regex.Matcher;
  24. import java.util.regex.Pattern;
  25. import org.apache.commons.logging.Log;
  26. import org.apache.commons.logging.LogFactory;
  27. /**
  28.  * Plugin to calculate virtual and physical memories on Linux systems.
  29.  */
  30. public class LinuxMemoryCalculatorPlugin extends MemoryCalculatorPlugin {
  31.   private static final Log LOG =
  32.       LogFactory.getLog(LinuxMemoryCalculatorPlugin.class);
  33.   /**
  34.    * proc's meminfo virtual file has keys-values in the format
  35.    * "key:[ t]*value[ t]kB".
  36.    */
  37.   private static final String PROCFS_MEMFILE = "/proc/meminfo";
  38.   private static final Pattern PROCFS_MEMFILE_FORMAT =
  39.       Pattern.compile("^([a-zA-Z]*):[ t]*([0-9]*)[ t]kB");
  40.   // We just need the values for the keys MemTotal and SwapTotal
  41.   private static final String MEMTOTAL_STRING = "MemTotal";
  42.   private static final String SWAPTOTAL_STRING = "SwapTotal";
  43.   private long ramSize = 0;
  44.   private long swapSize = 0;
  45.   boolean readMemInfoFile = false;
  46.   private void readProcMemInfoFile() {
  47.     if (readMemInfoFile) {
  48.       return;
  49.     }
  50.     // Read "/proc/memInfo" file
  51.     BufferedReader in = null;
  52.     FileReader fReader = null;
  53.     try {
  54.       fReader = new FileReader(PROCFS_MEMFILE);
  55.       in = new BufferedReader(fReader);
  56.     } catch (FileNotFoundException f) {
  57.       // shouldn't happen....
  58.       return;
  59.     }
  60.     Matcher mat = null;
  61.     try {
  62.       String str = in.readLine();
  63.       while (str != null) {
  64.         mat = PROCFS_MEMFILE_FORMAT.matcher(str);
  65.         if (mat.find()) {
  66.           if (mat.group(1).equals(MEMTOTAL_STRING)) {
  67.             ramSize = Long.parseLong(mat.group(2));
  68.           } else if (mat.group(1).equals(SWAPTOTAL_STRING)) {
  69.             swapSize = Long.parseLong(mat.group(2));
  70.           }
  71.         }
  72.         str = in.readLine();
  73.       }
  74.     } catch (IOException io) {
  75.       LOG.warn("Error reading the stream " + io);
  76.     } finally {
  77.       // Close the streams
  78.       try {
  79.         fReader.close();
  80.         try {
  81.           in.close();
  82.         } catch (IOException i) {
  83.           LOG.warn("Error closing the stream " + in);
  84.         }
  85.       } catch (IOException i) {
  86.         LOG.warn("Error closing the stream " + fReader);
  87.       }
  88.     }
  89.     readMemInfoFile = true;
  90.   }
  91.   /** {@inheritDoc} */
  92.   @Override
  93.   public long getPhysicalMemorySize() {
  94.     readProcMemInfoFile();
  95.     return ramSize * 1024;
  96.   }
  97.   /** {@inheritDoc} */
  98.   @Override
  99.   public long getVirtualMemorySize() {
  100.     readProcMemInfoFile();
  101.     return (ramSize + swapSize) * 1024;
  102.   }
  103.   /**
  104.    * Test the {@link LinuxMemoryCalculatorPlugin}
  105.    * 
  106.    * @param args
  107.    */
  108.   public static void main(String[] args) {
  109.     LinuxMemoryCalculatorPlugin plugin = new LinuxMemoryCalculatorPlugin();
  110.     System.out.println("Physical memory Size(bytes) : "
  111.         + plugin.getPhysicalMemorySize());
  112.     System.out.println("Total Virtual memory Size(bytes) : "
  113.         + plugin.getVirtualMemorySize());
  114.   }
  115. }