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