首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java垃圾收集会安全地清除垃圾数据吗?

java垃圾收集会安全地清除垃圾数据吗?
EN

Stack Overflow用户
提问于 2016-07-30 02:19:27
回答 3查看 1.3K关注 0票数 5

这是一个内存数据安全问题。

java垃圾收集会安全地清除垃圾数据吗?

显然,在一大块数据被垃圾收集后,我不能再检索它了,但是黑客仍然可以通过内存转储来检索数据吗?

EN

回答 3

Stack Overflow用户

发布于 2016-07-30 03:00:56

正如其他用户在这里已经提到的,JVM在垃圾收集之后不会安全地清理内存,因为这会严重影响性能。这就是为什么许多程序(特别是安全库)使用可变结构而不是不可变结构(字符数组而不是字符串等),并在不再需要数据时自行清理数据。

不幸的是,即使这样的方法也不总是有效的。让我们看一下这个场景:

  1. 您创建了一个带有密码的字符数组。
  2. JVM执行垃圾收集,并将您的字符数组移动到内存中的另一个位置,使其先前占用的内存保持不变,只是将其标记为空闲块。现在,我们有了您的密码的“脏副本”。
  3. 您已经完成了密码的处理,并将字符数组中的所有字符显式置零,以为现在一切都安全了。
  4. 攻击者将您的内存转储,并在第2步之前第一次放置密码的内存中找到您的密码。

对于这个问题,我只能想到一种可能的解决方案:

  1. 使用G1垃圾将您的敏感数据分成一个块(原始值的数组),该块大小足以占据G1使用的一半以上的区域大小(默认情况下,此大小取决于最大堆大小,但您也可以手动指定)。这将迫使收集器将您的数据视为所谓的“巨型对象”。G1 GC不会在内存中移动此类对象。
  2. 在这种情况下,当您手动擦除块中的某些数据时,您可以确保堆中的某个位置不存在相同数据的其他“脏副本”。

另一种解决方案是使用堆外数据,您可以根据需要手动处理这些数据,但这不是纯Java。

票数 5
EN

Stack Overflow用户

发布于 2016-07-30 02:23:39

这取决于JVM实现和其中可能的选项,但我假设它不会清除数据。垃圾收集只需要跟踪哪些区域是可用的。将所有数据设置为0或其他值是大量不必要的写入。正因为如此,你会经常看到API使用字符数组作为密码,而不是字符串。

票数 2
EN

Stack Overflow用户

发布于 2016-07-30 02:32:41

具体地说,Oracle JVM不会清除空间,它只在Eden和Survivor空间之间复制数据,不再使用的对象只是停留在那里作为垃圾,最终将被覆盖。类似的事情也发生在OldGen中,一些地方被标记为已用,当对象有资格进行垃圾回收时,它所占用的地方也被标记为未使用。如果有足够的应用时间,它最终也会被覆盖。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38665202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档