Практические ограничения использования памяти 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 может справиться с этим объемом памяти, так как ОС поддерживает его.