这是一个记忆数据安全问题 java垃圾收集是否安全地清除了垃圾数据?
显然在一大块数据被垃圾收集后,我再也无法检索它了,但是黑客还可以通过内存转储来检索数据吗?
答案 0 :(得分:5)
正如其他用户已在此处提到的那样,JVM在垃圾回收后不会安全地清理内存,因为它会严重影响性能。这就是为什么许多程序(尤其是安全库)使用可变结构而不是不可变(char数组而不是字符串等),并在不再需要时自行清理数据。
不幸的是,即使这样的方法并不总是有效。我们来看看这个场景:
我只能想到这个问题的一种可能解决方案:
另一个解决方案是使用您可以手动处理的堆外数据,但这不是纯Java。
答案 1 :(得分:2)
这取决于JVM实现以及可能的选项,但我认为它不会清除数据。垃圾收集只需跟踪哪些区域可用。将所有数据设置为0或其他内容是很多不必要的写入。出于这个原因,您经常会看到API使用char数组代替字符串而不是字符串。
答案 2 :(得分:0)
具体而言,Oracle JVM无法清除空间,它只在Eden和Survivor空间之间复制数据,不再使用的对象只会留在那里作为最终会被覆盖的垃圾。类似的事情发生在OldGen中,有些地方被标记为已使用,当对象符合垃圾收集条件时,它占用的地方被标记为未使用。如果有足够的申请时间,它也会被覆盖。