毎日1段のコード、署名

1483 ワード

package tmp

import java.lang.management.ManagementFactory

/**
  * Created by fhqplzj on 17-1-20 at   9:56.
  */
object pro4 {
  val memory: Int = inferDefaultMemory()

  def inferDefaultCores(): Int = Runtime.getRuntime.availableProcessors()

  def inferDefaultMemory(): Int = {
    val ibmVendor = System.getProperty("java.vendor").contains("IBM")
    var totalMb = 0
    try {
      val bean = ManagementFactory.getOperatingSystemMXBean
      if (ibmVendor) {
        val beanClass = Class.forName("com.ibm.lang.management.OperatingSystemMXBean")
        val method = beanClass.getDeclaredMethod("getTotalPhysicalMemory")
        totalMb = (method.invoke(bean).asInstanceOf[Long] / 1024 / 1024).toInt
      } else {
        val beanClass = Class.forName("com.sun.management.OperatingSystemMXBean")
        val method = beanClass.getDeclaredMethod("getTotalPhysicalMemorySize")
        totalMb = (method.invoke(bean).asInstanceOf[Long] / 1024 / 1024).toInt
      }
    } catch {
      case _: Exception =>
        totalMb = 2 * 1024
        println("Failed to get total physical memory. Using " + totalMb + " MB")
    }
    math.max(totalMb - 1024, 1024)
  }

  def checkWorkerMemory(): Unit = {
    if (memory <= 0) {
      val message = "Memory is below 1MB, or missing a M/G at the end of the memory specification?"
      throw new IllegalStateException(message)
    }
  }
}