Сколько байтов памяти использует объект 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.