@ Дейв и Кейси, вам не нужны никакие доказательства, чтобы показать, что непрерывная структура памяти повышает эффективность кэширования, что является основным узким местом в большинстве приложений ООП, которые требуют высокой производительности, но следуют «слишком идеалистической» траектории разработки ООП.
Люди часто считают, что GC является виновником низкой производительности высокопроизводительных Java-приложений, и после исправления просто оставьте это без фактического профилирования поведения приложения в памяти. Обратите внимание, что инструкции без кэширования по своей природе дороже, чем арифметические инструкции (и становятся все дороже из-за разрыва в доступе к памяти <->). Поэтому, если вы заботитесь о производительности, вам, безусловно, следует заботиться об управлении памятью.
Программирование, ориентированное на кэш, или, в более общем смысле, ориентированное на данные программирование, является ключом к достижению высокой производительности во многих видах приложений, таких как игры или мобильные приложения (для снижения энергопотребления).
Здесь - это SO поток на DOP.
Здесь - это слайд-шоу из отдела исследований и разработок Sony, в котором показана полезность DOP применительно к игре для PlayStation (требуется высокая производительность).
Так как решить проблему, которую Java, вообще, не позволяет выделить кусок памяти? Я предполагаю, что когда программа только начинается, вы можете предположить, что на уже выделенных страницах очень мало внутренней фрагментации. Если у вас теперь есть цикл, который выделяет тысячи или миллионы объектов, они, вероятно, будут все как можно более смежными. Обратите внимание, что вам нужно только удостовериться, что последовательные объекты растягиваются по одной и той же кеш-линии, которая во многих современных системах составляет всего 64 байта. Кроме того, посмотрите на слайды DOP, если вы действительно заботитесь о (памяти) производительности вашего приложения.
Вкратце: всегда выделяйте несколько объектов одновременно (увеличивайте временную локализацию выделения), и, если ваш GC имеет дефрагментацию, запускайте его заранее, иначе попытайтесь сократить такое распределение до начала вашей программы.
Надеюсь, это поможет,
-Domi
PS: @Dave, библиотека пула общих ресурсов не распределяет объекты непрерывно. Он только отслеживает распределения, помещая их в эталонный массив, встроенный в стек, связанный список или тому подобное.