Статьи

Java: все о 64-битном программировании

 Я нашел эту серию статей очень интересной. Все о 64-битном программировании в одном месте, которое собирает «много ссылок на тему разработки 64-битного программного обеспечения на C / C ++». Однако некоторые из этих вопросов относятся к Java и могут изменить ситуацию.

Size_t в C ++ является 64-битным

Java использует
тип
int для размеров, и это не меняется в 64-битной JVM. Это обеспечивает обратную совместимость, но ограничивает массивы, коллекции и ByteBuffer этим размером. Обычно достаточно 2 миллиардов, но по мере того, как размеры файлов и объем памяти увеличиваются, число ситуаций, когда их нет, со временем будет расти.

По состоянию на середину 2011 года за 1 000 фунтов стерлингов вы можете купить компьютер с 24 ГБ памяти, а за 21 000 фунтов стерлингов — сервер с 512 ГБ памяти.

Это уже проблема для отображения в памяти файла размером более 2 ГБ. Это может быть сделано только путем отображения в окне памяти объемом 2 ГБ (2 ^ 31-1 байт за раз). Это довольно некрасиво и убирает одну из ключевых особенностей отображения памяти; прозрачность.

Кстати, я попытался использовать базовую библиотеку напрямую, используя отражение, которое поддерживает `длинные ‘длины, и я мог бы заставить это работать для чтения файлов размером более 2 ГБ, но не для записи.

х64 имеет больше регистров чем х86

Это будет маленьким преимуществом. Если вы выполняете много операций, используя
длинные, я видел улучшение производительности примерно на 10%.

64-битная JVM может получить доступ к большему объему памяти

Это важно, если вам требуется более 1,2-3,5 ГБ памяти (в зависимости от ОС). Недостатком является то, что 64-битные ссылки могут увеличить использование памяти и снизить производительность.

Одним из способов эффективного использования 64-битной JVM является использование
-XX: + UseCompressedOops, который использует 32-битные ссылки таким образом, что все еще может получить доступ к 32 ГБ памяти. Это возможно благодаря тому, что каждый объект в JVM Sun / Oracle размещается на 8-байтовой границе (т. Е. Младшие 3 бита адреса равны 000). Сдвигая биты 32-битной ссылки, он может получить доступ к 4 ГБ * 8. или 32 ГБ всего. Было предложено, чтобы это было по умолчанию для Java 7.

Ссылка:
что такое 64-битные системы.

Поддержка 32-битных программ

Программы, написанные и скомпилированные для 32-битной JVM, будут работать без перекомпиляции. Однако любые нативные библиотеки не будут. 64-разрядная JVM может загружать только 64-разрядные собственные библиотеки.

Переключение между int и long

INT и
длинные типы работают то же самое на 32-битной и 64-битной JVM , однако , если вы переключитесь код между
междунар и
долго вы можете получить некоторые проблемы.

Длинные литералы могут нуждаться в ell

Со всеми
литералами
int вы можете просто использовать число

int i = 123456789;
long j = 123456789;

Однако для больших чисел ап
л требуется.

long i = 111111111111111L; // a long literal.
long j = 111111111111111l; // using `l` is discouraged as it looks like a 1.

Если у вас есть расчетные значения, вам может понадобиться использовать
L

long i = 1 << 40; // i = 256!
long i = 1L << 40; // i = 2^40

Оператор сдвига принимает только младшие 5 бит сдвига для 32-разрядных чисел и 6 бит для 64-разрядных значений. Так что первая строка

long i = 1 << (40 % 32);

Головоломка

Головоломка для вас. ? Что это делает для 32-битной и 64-битной для
х ?

sign = x >> -1;

64-битные ссылки и размер объекта

При использовании 64-битных ссылок размер ссылки удваивается. В JVM Sun / Oracle заголовок содержит ссылку. Из
источника для Map.Entry

class MapEntry implements Map.Entry, Cloneable {
       K key;
       V value;

В 32-битной JVM заголовок занимает 8 байтов, для каждой ссылки это всего 16 байтов.

В 64-разрядной JVM с 32-разрядными ссылками заголовок занимает 8 + 4 байта, а каждая ссылка занимает 4 байта. Выровненный 8 байтов означает, что он использует (12 + 4 + 4 байта + 4 дополнения) всего: 24 байта.

С 64-битными ссылками заголовок использует 16 байтов, а каждая ссылка использует 8 байтов. (16 + 8 + 8) всего: 32 байта.

Для более подробной информации читайте
Java: Получение размера объекта

Вывод

Миграция с 32-битной на 64-битную версию в Java относительно проста по сравнению с C / C ++, однако есть некоторые проблемы, которые вам, возможно, придется учитывать при миграции.

От http://vanillajava.blogspot.com/2011/07/java-all-about-64-bit-programming.html