【发布时间】:2016-04-13 08:38:01
【问题描述】:
我有以下代码要测试:
import java.math.BigInteger;
import java.util.Random;
public class TestBigInteger {
public static void main(String[] args) {
BigInteger bigInteger = BigInteger.probablePrime(32, new Random())
.multiply(BigInteger.probablePrime(32, new Random()));
BigInteger n = BigInteger.probablePrime(20, new Random());
while (!Thread.interrupted()) {
bigInteger.mod(n);
}
}
}
我从 jconsole 得到了以下情节:
为什么会这样?如果我的 bigInteger 只有 64 位长度,为什么 mod 操作会占用大量内存?
【问题讨论】:
-
因为垃圾收集器不会在每个对象之后运行,它会在内存达到一定阈值时运行,然后清理所有旧引用
-
嗯,它正在制造垃圾。
BigInteger.mod()创建了几个你刚刚扔掉的对象。但是,您可以看到 GC 每隔一段时间就会收到垃圾。 -
为什么说 BigInteger 是 8 字节?作为对象,它至少有 12 字节的头部和信息。我不知道 BigInteger 的内部结构,但我认为它远远超过 8 个字节的信息。此外,对象排列为 8 的倍数.. 所以.. 真的不能是 64 位
-
@Jack,我的意思是 bigInteger 是产生两个 32 位数字。所以我认为 bigInteger 是 64 位的。
标签: java memory garbage-collection biginteger jconsole