Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java字符串AES加密/解密中的内存问题/泄漏_Java_String_Encryption - Fatal编程技术网

java字符串AES加密/解密中的内存问题/泄漏

java字符串AES加密/解密中的内存问题/泄漏,java,string,encryption,Java,String,Encryption,我的问题是,我正在解密/加密来自不同线程的一些随机值字符串集,但经过多次迭代后,内存迅速增加。 我的观察是,内存增加是因为每次加密/解密都会产生新的字符串,因此内存会增加。 需要注意的另一点是我的解密/加密字符串的值与从多个线程加密/解密的相同字符串集(某些字符串可能是新的)的值相同,但由于在每个加密/解密中,密码返回字节数组,要再次构成字符串,我必须使用“new String()'功能,这可能或将快速增加内存。 这是我加密/解密字符串的代码 public static String encry

我的问题是,我正在解密/加密来自不同线程的一些随机值字符串集,但经过多次迭代后,内存迅速增加。
我的观察是,内存增加是因为每次加密/解密都会产生新的字符串,因此内存会增加。
需要注意的另一点是我的解密/加密字符串的值与从多个线程加密/解密的相同字符串集(某些字符串可能是新的)的值相同,但由于在每个加密/解密中,密码返回字节数组,要再次构成字符串,我必须使用“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);
}

stringintern方法可能是一种可行的方法。它返回字符串的规范表示形式,因此对于相同的字符串,只有一个实例。 因此,当您返回字符串时,请尝试执行以下操作:

 new String(byteDecryptedText).intern();

您使用new创建的字符串实例将在退出范围后收集。将返回内部对象。

String intern方法可能是最佳选择。它返回字符串的规范表示形式,因此对于相同的字符串,只有一个实例。 因此,当您返回字符串时,请尝试执行以下操作:

 new String(byteDecryptedText).intern();

您使用new创建的字符串实例将在退出范围后收集。将返回内部对象。

String intern方法可能是最佳选择。它返回字符串的规范表示形式,因此对于相同的字符串,只有一个实例。 因此,当您返回字符串时,请尝试执行以下操作:

 new String(byteDecryptedText).intern();

您使用new创建的字符串实例将在退出范围后收集。将返回内部对象。

String intern方法可能是最佳选择。它返回字符串的规范表示形式,因此对于相同的字符串,只有一个实例。 因此,当您返回字符串时,请尝试执行以下操作:

 new String(byteDecryptedText).intern();

您使用new创建的字符串实例将在退出范围后收集。将返回内部对象。

每个迭代都会产生新的字符串,但我认为这不会很快增加内存,因为字符串所需的内存是以字节为单位的。

根据您可以计算您加密或解密的字符串的大小。这可以让您了解内存的增加是否是因为每次都会形成新字符串。

的确,每次迭代都会产生新字符串,但我认为这不会很快增加内存,因为字符串所需的内存是以字节为单位的。

根据您可以计算您加密或解密的字符串的大小。这可以让您了解内存的增加是否是因为每次都会形成新字符串。

的确,每次迭代都会产生新字符串,但我认为这不会很快增加内存,因为字符串所需的内存是以字节为单位的。

根据您可以计算您加密或解密的字符串的大小。这可以让您了解内存的增加是否是因为每次都会形成新字符串。

的确,每次迭代都会产生新字符串,但我认为这不会很快增加内存,因为字符串所需的内存是以字节为单位的。

根据您可以计算您加密或解密的字符串的大小。这可以让您了解内存增加是否是由于每次都会形成新字符串。

您可以在从字节数组中提取
字符串后,立即调用
字符串上的
intern()
,并删除对
字符串的所有引用。当然,
字符串
在垃圾回收之前会占用内存,但我看不出还有什么比这更好。@DavidWallace这意味着我必须在新字符串(bytedcryptedtext)上调用intern;是的,很明显。但无论如何,您必须在某个时候调用
新字符串(BytedCryptedText)
。@DavidWallace我这样做了,但没有改善相同的内存峰值。我们不要在聊天中继续讨论。现在是凌晨1点。我需要去睡觉了。也许其他人可以帮你。或者您可以等到我醒来。您可以在从字节数组中提取
字符串后立即调用
intern()
,并删除对
字符串的所有引用。当然,
字符串
在垃圾回收之前会占用内存,但我看不出还有什么比这更好。@DavidWallace这意味着我必须在新字符串(bytedcryptedtext)上调用intern;是的,很明显。但无论如何,您必须在某个时候调用
新字符串(BytedCryptedText)
。@DavidWallace我这样做了,但没有改善相同的内存峰值。我们不要在聊天中继续讨论。现在是凌晨1点。我需要去睡觉了。也许其他人可以帮你。或者您可以等到我醒来。您可以在从字节数组中提取
字符串后立即调用
intern()
,并删除对
字符串的所有引用。当然,
字符串
在垃圾回收之前会占用内存,但我看不出还有什么比这更好。@DavidWallace这意味着我必须在新字符串(bytedcryptedtext)上调用intern;是的,很明显。但无论如何,您必须在某个时候调用
新字符串(BytedCryptedText)
。@DavidWallace我这样做了,但没有改善相同的内存峰值。我们不要在聊天中继续讨论。现在是凌晨1点。我需要去睡觉了。也许其他人可以帮你。或者您可以等到我醒来。您可以在从字节数组中提取
字符串后立即调用
intern()
,并删除对
字符串的所有引用。当然,
字符串
会占用内存,直到它被垃圾回收为止,