2009-06-04 3 views
15

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

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

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

+0

Если ваш установщик находится в java - он будет работать только в том случае, если JRE был установлен ... – Nate

+0

Спасибо - в этом случае JRE является одним из перечисленных требований программного обеспечения, поэтому нам разрешено это там :) –

+0

даже через JMX невозможно – dfa

ответ

3

Для окон вам необходимо получить доступ к WMI - это поможет вам: Accessing Windows Management Instrumentation (WMI) from Java.

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

Это может быть чистый способ использования java, но я не знаю об этом.

+0

Спасибо! Похоже, что этот класс не поддерживается в XP и Server 2003 и недоступен в Vista (http://msdn.microsoft.com/en-us/library/aa394181(VS.85).aspx). По-видимому, Win32_OperatingSystem является его заменой. –

+0

Да, разные версии окон поддерживают разные классы WMI. Вам нужно будет настроить на основе вашей целевой ОС. – Nate

1

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

+0

Приветствия - по-видимому, мне нужно было бы назвать это через JNI? –

+0

Да, это C syscall. Из cmdline вы можете анализировать результаты из бесплатного (1), я уверен, что есть еще лучший способ, но не могу думать об этом прямо сейчас. Вы могли бы поместить все это в сценарий оболочки или пакет, который пользователи также используют для установки вашего приложения, вместо использования jni. – wds

4

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

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

17

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

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

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

+1

ИМХО, это, безусловно, лучший ответ. workd на linux, а также на окнах. нет необходимости в специальной обработке с WMI для окон ... –

+2

Обратите внимание, что при использовании 32-разрядной JVM это никогда не вернет более 4 ГБ. – berry120

+0

Спасибо, хорошо. Это то, что мне нужно. Я собирался создать обходной путь C++ и вызывать его из своей Java-программы. –

3

Что относительно местных 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"); 

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

Смежные вопросы