Как мне найти физический объем памяти в Java? - PullRequest
17 голосов
/ 04 июня 2009

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

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

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

Ответы [ 7 ]

19 голосов
/ 10 сентября 2012

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

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

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

4 голосов
/ 23 сентября 2013

А как насчет локальных 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");

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

4 голосов
/ 04 июня 2009

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

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

3 голосов
/ 04 июня 2009

Для окон вам понадобится доступ к WMI - это поможет вам: Доступ к инструментарию управления Windows (WMI) из Java .

Вы захотите использовать этот раздел WMI: Win32_LogicalMemoryConfiguration.

Может быть, это может быть чисто Java, но я не знаю об этом.

1 голос
/ 22 января 2019
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");    

 }
}
1 голос
/ 04 июня 2009

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

0 голосов
/ 26 июня 2018

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

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

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

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

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

...