2013-02-13 2 views
3

A comment в this blog состоянии:Является ли непрерывная память проще в 64-битном адресном пространстве? Если да, то почему?

Мы знаем, как сделать блочные кучи, но было бы некоторые накладные расходы на их использование. У нас больше запросов на более быстрое управление хранилищем, чем , которые мы делаем для больших куч в 32-битной JVM. Если вы действительно хотите большие кучи, переключитесь на 64-битную JVM. Нам все еще нужна непрерывная память, , но гораздо проще попасть в 64-разрядное адресное пространство.

Эта эмпирификация приведенного выше утверждения состоит в том, что легче получить непрерывную память в 64-разрядном адресном пространстве. Это правда? Если да, то почему?

ответ

4

Это очень верно. Процесс должен выделять память из адресного пространства виртуальной памяти. В котором хранятся код и данные и размер которых ограничен возможностями адресации архитектуры. Вы никогда не сможете адресовать более 2^32 байта в 32-битном процессе, не считая трюков с банковской коммутацией. Это 4 гигабайта. Операционная система обычно вынимает большой кусок из этого же, в 32-битной Windows, например, который сокращает адресный размер виртуальной машины до 2 гигабайт.

В идеале, ассигнования производятся таким образом, чтобы они плотно прилегали друг к другу. Это очень редко получается на практике. В общих библиотеках или DLL, в частности, необходимо выбрать предпочтительный адрес загрузки, и это нужно угадывать спереди, когда библиотека построена.

Таким образом, на практике ассигнования производятся из отверстий между существующими и максимально возможными смежным Распределение, которое вы можете получить, ограничено размером с наибольшим отверстием. Обычно намного меньше адресного размера VM, в Windows обычно около 650 мегабайт. То, что имеет тенденцию идти вниз-холм оттуда, поскольку доступное адресное пространство получает фрагментировано распределениями. В частности, с помощью собственного кода, который не может позволить себе распределений, перемещаемых уплотняющим сборщиком мусора. Если вы используете Windows, вы можете получить представление о распределении VM с помощью утилиты VMMap SysInternals.

Эта проблема полностью исчезает в 64-битном процессе. Теоретический адресный объем виртуальной памяти составляет 2^64, огромное количество. Настолько большие, что текущие процессоры не реализуют его, они могут достигать 2^48. Кроме того, вы ограничены версией операционной системы и ее готовностью хранить таблицы сопоставления страниц для этой большой виртуальной машины. Типичный предел - восемь терабайт. Подразумевается, что отверстия между распределениями являются огромными. Ваша программа будет зависеть от файла пейджинга, прежде чем он умрет от OOM.

0

Я не могу говорить о том, как реализуется JVM, но с чисто теоретической точки зрения, если у вас есть значительно большее виртуальное адресное пространство (например, 64-бит по сравнению с 32-битным), это должно быть значительно проще чтобы найти большой блок непрерывной памяти, доступный для выделения (переход в крайности - у вас нет шансов найти непрерывную 4 ГБ свободной памяти в 32-разрядном адресном пространстве, но значительный шанс найти это пространство в полное 64-разрядное адресное пространство).

Следует отметить, что независимо от размера виртуального адресного пространства это все равно будет реализовано путем выделения (возможно) несмежных страниц физической памяти, особенно если требуемое распределение велико - большее виртуальное адресное пространство просто означает, что, вероятно, будут доступны более смежные виртуальные адреса, доступные для использования.

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