簡體   English   中英

BigInteger耗費了大量的記憶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM