Сколько пространства использует BigInteger?

Сколько байтов памяти использует объект BigInteger вообще?

Ответ 1

BigInteger внутренне использует int[] для представления огромных чисел, которые вы используете. Таким образом, он действительно зависит от размера номера, который вы храните в нем. int[] будет расти, если текущее число не соответствует динамически.

Чтобы получить количество байтов, которое использует ваш экземпляр BigInteger, вы можете использовать интерфейс Instrumentation, особенно getObjectSize(Object).

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

Чтобы убедить себя, посмотрите исходный код, где говорится:

/**
 * The magnitude of this BigInteger, in <i>big-endian</i> order: the
 * zeroth element of this array is the most-significant int of the
 * magnitude.  The magnitude must be "minimal" in that the most-significant
 * int ({@code mag[0]}) must be non-zero.  This is necessary to
 * ensure that there is exactly one representation for each BigInteger
 * value.  Note that this implies that the BigInteger zero has a
 * zero-length mag array.
 */
final int[] mag;

Ответ 2

Следуйте за этим сообщением:

BigInteger:
  int bitCount +4 bytes
  int bitLength +4 bytes
  int firstNonzeroIntNum +4 bytes
  int lowestSetBit +4 bytes
  int signum +4 bytes
  int[] mag +?

В общей сложности 20 байтов + целочисленный массив. Integer массив длины N имеет размер 4N + 24 (служебные данные массива + 4 байта/целое число).

В сумме это составляет 4N + 44 байта, в зависимости от того, насколько большой ваш номер. Не забывайте, что ссылка на объект также использует память.

Изменить: 16 дополнительных байтов в качестве служебных данных объекта, приносит их 4N + 60 байт. Добавляя дополнение к этому (каждый объект использует кратное 8 байтам), мы получаем дополнительные 4 байта.

В результате получается 4N + 64 байт.

Ответ 3

Размер объекта Java зависит от его полей. Это поля BigInteger

final int signum;
final int[] mag;
private int bitCount;
private int bitLength;
private int lowestSetBit;
private int firstNonzeroIntNum;

мы можем вычислить размер экземпляра BigInteger как

8 + 4 + (12 + mag.length * 4) + 4 + 4 + 4 + 4  ~= 40 + mag.length * 4 

см. http://www.javamex.com/tutorials/memory/object_memory_usage.shtml.

Ответ 4

Используя сохраненный размер VisualVM на 64-битной JVM, вот некоторые конкретные цифры:

  • BigInteger 1 цифра = 70B (например, новый BigInteger ("9"))
  • BigInteger 20 цифр = 80B (например, новый BigInteger ("12345678901234567890"))
  • BigInteger 100 цифр = 112B

Для сравнения:

  • Long (класс оболочки) = 24B (но Long ограничен 18-19 цифрами)
  • длинный (примитивный) = 8B

Так BigInteger, по крайней мере 3 раза тяжелее, чем Long и 10x тяжелее, чем long. Так что используйте BigInteger только тогда, когда это действительно нужно!

Ответ 5

Он может представлять целое число любого размера. Выделенная память для вашего приложения - Limit.