小编典典

如何避免java.lang.OutOfMemoryError?

java

我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b);

import java.math.BigInteger;    
public class FermatOne    
{    
    public static void main(String[] args)    
    {    
         BigInteger a = new BigInteger ("2");    
         BigInteger k = new BigInteger ("15");    
         BigInteger c = new BigInteger ("1");    
         int b = 332192810;    
         BigInteger n = new BigInteger ("2");    
         BigInteger power;    
         power = a.pow(b);    
         BigInteger exponent;    
         exponent = k.multiply(power);    
         BigInteger mod;    
         mod = exponent.add(c);    
         BigInteger result = n.modPow(exponent,mod);    
         System.out.println("Result is  ==> " + result);    
     }    
}

第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b)

import java.math.BigInteger;    
public class FermatOne    
{    
    public static void main(String[] args)    
    {

         BigInteger k = new BigInteger ("15");    
         BigInteger c = new BigInteger ("1");    
         int b = 332192810;    
         BigInteger n = new BigInteger ("2");    
         BigInteger power;    
         power = BigInteger.ONE.shiftLeft(b);    
         BigInteger exponent;    
         exponent = k.multiply(power);    
         BigInteger mod;    
         mod = exponent.add(c);    
         BigInteger result = n.modPow(exponent,mod);    
         System.out.println("Result is  ==> " + result);    
     }    
}

在命令行中设置内存标志-
Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间

我的问题:我应该在第二个代码中更改什么以避免java.lang.OutOfMemoryError?


阅读 238

收藏
2020-11-26

共1个答案

小编典典

您正在尝试计算类似的数字2 ^ (15 * 2 ^ 332192809)。我不知道你是否可以在宇宙中找到这样的数字!也许答案仅仅是…
42?;-)

更严重的是,计算此数字确实会遇到麻烦。 以位进行编码,15 * 2 ^ 332192810本身将需要近一个千兆字节。然后再提升到2那种力量,我不想知道…

在一个更严重的是,当你钻进去执行java.math.BigInteger,我认为你正好碰上这样的错误 更快
与左移,为实现更高效,比功率的方法。话虽如此,您是否尝试过使用代码强制垃圾回收System.gc()

更新 :我原来的推理可能是错误的。2 ^ 332192809可以用1GB计算。java.math.BigInteger尽管我相信此计算可能要花一些时间,但总的结果可能会被有效地“修改” 。

2020-11-26