private void func()
{
String str = "hi!";
}
这是我的代码。
假设我在onCreate事件中调用了func()。 我希望在接近确切的时间,如果可以确定,当GC将释放str使用的内存时。
实际上str存储密码。 我想尽快释放它。 目前在使用str后我将其值设置为不相关的值。
我听说GC是唯一可以释放回忆的东西吗? 那是对的吗? 有没有其他方法可以释放变量的内存。
答案 0 :(得分:9)
我想要接近确切的时间,如果可以确定, 当GC释放str。
使用的内存时
运气不好,你不能拥有它。
解决方案:将它存储在char []而不是String中,并在完成后将char []的所有元素清零。
答案 1 :(得分:2)
一旦垃圾收集器确信不再引用它,它就有资格进行垃圾收集。
但是,因为这是一个String,我记得这个文字仍然在String池中,但它的对象引用将被GC销毁。
但是,您无法影响GC的行为。
在你的方法的情况下,每次方法退出时变量超出范围,当它超出范围时,它变得符合GC的条件,但是GC是否决定释放它,我们无法控制或预测。
答案 2 :(得分:2)
首先,只要它想要,java就会保存这个字符串。理论上直到JVM终止。所以呢?谁可以连接到它并带来价值?怎么样?
但是如果你非常害怕,你可以致电System.gc()
可能触发GC运行并删除该值。仍然无法保证。
还有另一招。字符串包含其内容是私有字段char[] value
。您可以使用反射覆盖它,因此没有人会知道您的密码。
答案 3 :(得分:1)
在你的情况下str不是问题,当你声明一个字符串时,它被分配在你的应用程序的字符串池中。你应该创建一个字符数组。
关于GC,您在收集内存时无法保证。
答案 4 :(得分:1)
我不太了解Dalvik VM,但在标准Java中,没有办法从你的例子中释放内存,因为字符串“hi!”生活在不变的人群中。
如果您更改为
String str = new String("hi!");
在堆上提供一个字符串,可以是GC。
答案 5 :(得分:1)
您可以致电System.gc()
,但如果您查看java文档,这仅仅是建议性的。你不能在java中强制进行垃圾收集,一般来说这不是一个好主意。
如果您真的需要一个解决方案,您需要使用字节数组或JNI编写自己的自定义密码读取器/写入器,当然要非常小心,密码永远不会变成对象。否则你就输了。