[英]BigInteger cosumes a lot of memory
我有以下代碼來測試:
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操作會占用大量內存?
這並沒有留下很多內存,而是產生了大量的垃圾。
while (!Thread.interrupted()) {
bigInteger.mod(n); // create a new objects each time.
}
這個循環盡可能快地創建垃圾(也有一些CPU工作)因此你應該期望看到內存使用非常活躍。
如果我的bigInteger只有64位長度,為什么mod操作會占用大量內存?
這使得內存使用率更高,因為執行計算的實際CPU花費量相對較小。 如果你有一個更大的數字,與創建對象相比,它將花費更多的時間來使用CPU。 因為與使用的CPU相比,它花費更多時間來創建垃圾。
順便說一下,我建議您使用Java 6中的VisualVM和Java 7中的Java Mission Control,而不是使用jconsole。
函數BigInteger.mod
正在使用BigInteger.remainder
函數,該函數創建了一些MutableBigInteger
對象。
而且你通過調用創建了很多對象:
while (!Thread.interrupted()) {
bigInteger.mod(n); // create a new large object each time.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.