Как найти размер физической памяти в Java?
Я пишу установщик, который настроит конфигурацию продукта для конкретного оборудования, на котором он будет запущен. В частности, я хочу определить, сколько физической ОЗУ установлено в системе, поэтому я могу оценить, сколько памяти будет выделяться для продукта при его запуске.
В идеале я бы хотел сделать это не зависящим от платформы чистым Java-способом, так как установщик должен будет работать на нескольких разных платформах, но в случае, если это невозможно, решения для Windows предпочтительнее, чем наиболее распространенная платформа развертывания.
В этом случае можно с уверенностью предположить, что продукт будет единственным/основным приложением, работающим на коробке, поэтому мне не нужно беспокоиться о том, чтобы сжать кого-нибудь еще. Я не хочу излишне выделять, так как это, по нашему опыту, может повредить производительность.
Ответы
Ответ 1
Для окон вам нужно получить доступ к WMI - это поможет вам: Доступ к инструментарию управления Windows (WMI) из Java.
Вы хотите использовать этот раздел WMI: Win32_LogicalMemoryConfiguration.
Для этого может быть чистый java-способ, но я не знаю об этом.
Ответ 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");
}
}