Как найти размер физической памяти в Java?

Я пишу установщик, который настроит конфигурацию продукта для конкретного оборудования, на котором он будет запущен. В частности, я хочу определить, сколько физической ОЗУ установлено в системе, поэтому я могу оценить, сколько памяти будет выделяться для продукта при его запуске.

В идеале я бы хотел сделать это не зависящим от платформы чистым Java-способом, так как установщик должен будет работать на нескольких разных платформах, но в случае, если это невозможно, решения для Windows предпочтительнее, чем наиболее распространенная платформа развертывания.

В этом случае можно с уверенностью предположить, что продукт будет единственным/основным приложением, работающим на коробке, поэтому мне не нужно беспокоиться о том, чтобы сжать кого-нибудь еще. Я не хочу излишне выделять, так как это, по нашему опыту, может повредить производительность.

Ответы

Ответ 2

Вы можете использовать следующий код Java для запроса физической памяти:

com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean)
     java.lang.management.ManagementFactory.getOperatingSystemMXBean();
long physicalMemorySize = os.getTotalPhysicalMemorySize();

Но пакет com.sun.management является необязательным и не должен быть доступен на каждой платформе.

Ответ 3

Если вы намерены настроить параметры памяти для JVM для использования всей доступной физической памяти, но не более того, вы можете посмотреть на параметр -XX: + AggressiveHeap.

При этом вам не нужно знать доступную память. JVM автоматически масштабирует параметры.

Ответ 4

Как насчет локальных JMX и MBeans? Попробуйте следующее:

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
Object attribute = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize");
System.out.println("Total memory: "+ attribute.toString() +" B");

Вы можете получить доступ ко многим полезным данным таким образом.

Ответ 5

В linux вы можете использовать sysinfo (2). Я не думаю, что это действительно возможно из чистого java.

Ответ 6

За последние несколько лет сталкивался с этим вопросом несколько раз. Большинство существующих ответов являются хакерскими и зависят от платформы, так что, не существует ли сегодня каких-либо автономных, независимых от платформы инструментов для JAVA?

На самом деле, есть один: https://github.com/oshi/oshi

OSHI - это бесплатная (на базе JNA) (нативная) библиотека информации об операционной системе и оборудовании для Java. Он не требует установки каких-либо дополнительных собственных библиотек и нацелен на обеспечение кроссплатформенной реализации для извлечения системной информации, такой как версия ОС, процессы, использование памяти и ЦП, диски и разделы, устройства, датчики и т.д.

Да, он использовал JNI для внутреннего использования, как и другие методы, но кого это волнует, если все детали тщательно скрыты за чистым API, а пакет довольно легко установить, если вы используете какие-либо приличные современные инструменты управления зависимостями (maven, Gradle и т.д.).

Для любого серьезного проекта, используйте этот. Не изобретай велосипед.

Ответ 7

import java.lang.management.ManagementFactory;

import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;

public class Main {
  public static void main(String[] args) throws InstanceNotFoundException, AttributeNotFoundException, MalformedObjectNameException, ReflectionException, MBeanException  {
  /* Total number of processors or cores available to the JVM */


      MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
      Object attribute = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize");
      Object attribute2 = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "FreePhysicalMemorySize");
      System.out.println("Total memory: "+ Long.parseLong(attribute.toString()) / 1024  +"MB");
      System.out.println("Free  memory: "+ Long.parseLong(attribute2.toString()) / 1024  +"MB");    

 }
}