Практические ограничения использования памяти JVM и использования ЦП?
Предположим, что деньги не были ограничивающим фактором, и я хотел написать Java-программу, которая запускалась на одной мощной машине.
Целью было бы сделать программу Java запущенной как можно быстрее без необходимости менять или переходить на диск для чего-либо.
Скажем, что этот компьютер имеет:
- 1 ТБ ОЗУ (64 16 ГБ DIMM)
- 64 процессорных ядра (8 8-ядерных процессоров)
- работает 64-разрядный Ubuntu
Может ли один экземпляр java-программы, запущенной в JVM, воспользоваться этим большим количеством ОЗУ и процессоров?
Существуют ли какие-либо практические соображения, которые могут ограничить использование и эффективность?
- Ограничения ОС (память и потоки)?
- Ограничения памяти/кучи JVM?
- Ограничения потока JVM?
Спасибо,
Гален
Ответы
Ответ 1
Один экземпляр может попытаться получить доступ ко всей памяти, однако области NUMA означают, что такие вещи, как GC, плохо работают с памятью в другом регионе. Это происходит быстрее, и JVM поддерживает некоторую поддержку NUMA, но для улучшения масштабируемости ее необходимо улучшить. Даже при этом вы можете получить 256 МБ кучи и использовать 700 собственных/прямых памяти без этой проблемы.;)
Самое большое ограничение, если у вас много загрузок, состоит в том, что массивы, коллекции и ByteBuffer (для файлов с отображением памяти) ограничены размером 2 миллиарда. (2 ^ 31-1)
Вы можете обойти эти проблемы с пользовательскими коллекциями, но на самом деле Java должна поддерживать IMHO.
BTW: вы можете купить Dell R910 с 1 ТБ памяти и 24 ядра /48 потоков с Ubuntu за £ 40 тыс.
BTW: У меня есть только опыт JVM размером до 40 ГБ.
Ответ 2
Прежде всего, сама программа Java: плохо разработанный код не будет использовать такую мощь компьютера. Плохо реализованные потоки, например, могут замедлить работу.
ОС также является ограничивающим фактором: не все ОС хорошо справляются с этим объемом памяти.
Я думаю, что JVM может справиться с этим объемом памяти, поскольку ОС поддерживает его.