2016-04-10 20 views
0

Bir görüntüye yaklaşık 500mb büyük bir dosya şifrelemek için gereken bir web uygulaması geliştiriyorum. Kod ilk kez iyi çalışıyor ancak bundan sonra sunucum hata veriyor java.lang.OutOfMemoryError: Java yığın alanı. Netbeans ve glassfish server kullanıyorum. Ayrıca yığın boyutunu artırdım.java.lang.OutOfMemoryError: com.sun.crypto.provider.CipherCore.update adresinde Java yığın alanı

byte j[] = key.getBytes(); 
    SecretKeySpec kye = new SecretKeySpec(j, "AES"); 
    Cipher enc = Cipher.getInstance("AES"); 
    enc.init(Cipher.ENCRYPT_MODE, kye); 
    FileOutputStream output = new FileOutputStream("xyz.mkv"); 
    CipherOutputStream cos = new CipherOutputStream(output, enc); 
    byte[] buf = new byte[104857600]; 
    int read; 
    while ((read = file.read(buf)) != -1) { 
     cos.write(buf, 0, read); 
    } 
    output.flush(); 
    buf = null; 
    file.close(); 
    cos.close(); 

Neyin yanlış gittiğini bilmiyorum. Lütfen yardım edin. burada yığın izlemesi ..

Warning: StandardWrapperValve[DocEncrypt]: Servlet.service() for  
servlet DocEncrypt threw exception 
java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Arrays.java:3236) 
at com.sun.crypto.provider.CipherCore.update(CipherCore.java:666) 
at com.sun.crypto.provider.AESCipher.engineUpdate(AESCipher.java:371) 
at javax.crypto.Cipher.update(Cipher.java:1832) 
at javax.crypto.CipherOutputStream.write(CipherOutputStream.java:158) 
+1

Lütfen yığın yığınını bize gösterin. –

+0

@StephenC Yığın izlemeyi ekledim. –

cevap

1

görünüyor.

Gerçekten büyük bir arabellek kullanmayı seçtiniz; yani 104,857,600 bayt. Bu yüzden kripto yığınının çok büyük bir arabellek ayırması gerekiyor.

Çözümleri:

  1. Sen yığın boyutunu artırabilir.
  2. Tavsiye edilen: arabellek boyutunu daha makul bir şeye azaltabilirsiniz. 1MiB veya daha azını tavsiye ederim. (Bundan daha büyük, arabelleği büyütmeden elde edeceğiniz performans avantajı küçüktür ...)
+0

sorunu çözer ama bu algoritmanın performansını nasıl daha iyi yapabilirim –

+0

Java'da daha hızlı bir yol düşünemiyorum Şifreleme pahalıdır.Bunu yerel (üçüncü taraf) kütüphaneler veya bağımsız yerel kullanarak yapmayı deneyebilirsiniz. yardımcı programlar –

+0

Yardım için teşekkürler. –

0

Kısa cevap, Java Virtual Machine fe için maksimum bellek ayırma havuzu artırmak gerekir: -Xmx2048m Başvurunuzu başlattığınızda.

Daha fazla ayrıntı için this amswer numaralı telefonu işaretleyin. kripto yığın içten olan boyutu size write çağrı ile yazıyoruz bloğu ile aynı aynı olan bir tampon ayırdığından gibi stacktrace ve kaynak kodu dayanarak

+0

Muhtemelen. Daha az bellek ile yapmaya çalıştığı şeyi yapması da mümkündür. Örneğin, 100Mb bir arabellek görünüyor ... profligate. –

+0

hmm, ancak daha küçük bir arabellek değişimi (bellek bilge) kullanarak? Hemen hemen aynı olan sonuçta daha küçük byte [] dizileri yaratacaktır, değil mi? Bence GC, yine de devam etmek için yeterince hızlı olur. – grebesche

+0

Elbette olur. Daha küçük bir arabellek kullanırsanız, arabellek için daha küçük bir yığın düğümüdür. Önemli olan GC'nin hızı değil. İlk yaklaşımda, alanınız bittiğinde belirleyen tüm ulaşılabilir nesnelerin toplam boyutu. –

İlgili konular