2011-03-28 61 views
9

这是关于Java字符串常量池的。在我的一个程序中,我正在解密数据库的密码并将其存储在一个字符串中。我听说Java字符串将被存储在一个常量池中,并且它们不会被重新启动的虚拟机或加载了字符串退出的ClassLoader破坏。关于Java字符串常量池

如果是这种情况,我的密码将存储在字符串池中。我非常关心这个问题。有没有其他方法可以销毁这些文字或我可以做的任何事情。

请在此建议,

问候, 阳光。

回答

6

这里有几个不同的问题。首先,术语“常量池”指的是字符串和数字文字的类文件的非常特定的部分,或者指从驻留在JVM中的这部分类文件生成的数据结构。密码将不会存储在这里,除非它们是类文件的一部分。

但是,一些String对象确实是通过String internment在整个程序中存储和共享的。任何字符串文字都会自动被拦截,就像您调用intern()方法的任何字符串一样。据我所知,虽然没有其他字符串以这种方式存储,所以除非您自动实习保存密码的字符串,我不认为您需要担心这一点。

另一个需要注意的问题是,如果你不想让密码驻留在内存中,你可能需要小心垃圾收集,因为不再被引用的字符串仍然可以在内存中。同样,如果您使用某些字符串方法(如字符串之间共享后备表示的子字符串),则可以在完成使用后保留完整的密码字符串。

如果您担心的是其他Java代码能够看到已被禁用或仍然存在于内存中的旧密码,但您无需担心。无法迭代或查看实例化字符串池的元素,也无法破解打开字符串以查看其后备数组。

+1

从代码中找到这些字符串可能并不容易,但它们将处于堆转储中。如果我试图找到他们,我会尝试触发一个heapdump并尝试分解转储文件。 – Ryan 2015-06-01 22:06:54

3

这只适用于您称为intern()方法的字符串文字和字符串。想想看:如果它适用于所有的字符串,那么你会很快用完例如内存。一个处理具有不同(String)值的请求参数的servlet应用程序。

+0

Java 1.8.20引入了一个背景字符串重复数据删除功能,它与您的字符串intern()'d非常相似,没有任何人调用intern()... – Ryan 2015-06-01 22:04:01

+0

由于字符串,您调用'intern()',仍然在普通垃圾收集的情况下,没有理由对所有字符串进行处理,就好像在构建之后应用了intern(),应该提高内存需求。实际上,堆中会有*少量的字符串实例。但是,这样做会造成性能灾难...... – Holger 2016-09-15 16:32:56

-1

老兄,请使用字符串缓冲区来获取密码并对其执行(可能是)字符串类型的操作。

StringBuffer将字符串存储为char [],其中可以将删除。或覆盖或你有什么。 说StringBuffer.delete(0,StringBuffer.length());

或者只是得到数据库的密码作为一个char []和直接的工作 - 但我认为StringBuffer的方式(假设你已经取得了使用String方法所有的代码)将是一个更容易的飞跃。

+0

如果你控制界面,char []很好。如果你不得不调用一个将字符串作为字符串的方法,那么String对象将会被创建...... – Ryan 2015-06-01 21:59:42