0

私の問題は、さまざまなスレッドからランダムな値の文字列セットを復号化/暗号化していますが、何度も繰り返した後、メモリが急速に増加することです。
私の観察では、暗号化/復号化のたびに新しい文字列が生成され、それによりメモリが増加するため、メモリが増加します。
もう1つの注意点は、私の復号化/暗号化された文字列は、同じ文字列のセット(一部の文字列は新しい可能性があります)が多くのスレッドから暗号化/復号化されるため、非常に多くの同じ値を持つことですが、暗号化/復号化ごとに暗号がバイトを返すためです配列を作成し、再び文字列を構成するには、「new String()」関数を使用する必要があります。これにより、メモリが急速に増加する可能性があります。
これは、文字列を暗号化/復号化するための私のコードです

public static String encrypt(String key, String value) throws GeneralSecurityException 
{

    byte[] raw = key.getBytes();
    if (raw.length != 16) {
        throw new IllegalArgumentException("Invalid key size.");
    }

    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));
    byte[] cipherBytes= cipher.doFinal(value.getBytes());
    byte[] encoded =    org.apache.commons.codec.binary.Base64.encodeBase64(cipherBytes);
    return new String(encoded);

}

public static String decrypt(String key, String encrypted) throws GeneralSecurityException 
{

    byte[] raw = key.getBytes();
    if (raw.length != 16) {
        throw new IllegalArgumentException("Invalid key size.");
    }
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));
    byte[] byteDecodedText =  org.apache.commons.codec.binary.Base64.decodeBase64(encrypted.getBytes()) ;

    byte[] original = cipher.doFinal(byteDecodedText);

    return new String(original);
}
4

2 に答える 2

1

各反復が新しい文字列になるのは事実ですが、文字列に必要なメモリはバイト単位であるため、メモリが急速に増加するとは思いません。文字列のメモリ使用量
に 応じて、暗号化または復号化する文字列のサイズを計算できます。これにより、メモリの増加が毎回新しい文字列の形成によるものかどうかがわかります。

于 2013-10-23T14:48:36.773 に答える