关于Java字符串常量池

关于Java字符串常量池,java,string,passwords,constants,pool,Java,String,Passwords,Constants,Pool,这是关于Java字符串常量池的。在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中。我听说Java字符串将存储在一个常量池中,它们不会在VM重新启动或加载字符串的类加载器退出时被销毁 如果是这种情况,我的密码将存储在字符串池中。我非常关注这个问题。有没有其他方法可以破坏这些文字或其他我能做的事情 请就此提出建议, 问候,, Sunny。这只适用于您在上调用intern()方法的字符串文本和字符串。想想看:如果它应用于所有字符串,那么在处理具有不同(字符串)值的请求参数的servlet应

这是关于Java字符串常量池的。在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中。我听说Java字符串将存储在一个常量池中,它们不会在VM重新启动或加载字符串的类加载器退出时被销毁

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

请就此提出建议,

问候,,
Sunny。

这只适用于您在上调用
intern()
方法的字符串文本和字符串。想想看:如果它应用于所有字符串,那么在处理具有不同(字符串)值的请求参数的servlet应用程序中,您将很快耗尽内存

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

然而,一些字符串对象确实是通过字符串存储在整个程序中存储和共享的。任何字符串文本都会被自动插入,对其调用intern()方法的任何字符串也是如此。不过,就我所知,没有其他字符串是以这种方式存储的,因此,除非你自己自动插入保存密码的字符串,否则我认为你不必担心这一点

另一个需要注意的问题是,如果不希望密码驻留在内存中,则可能需要小心垃圾收集,因为不再引用的字符串可能仍在内存中。类似地,如果您使用某些字符串方法(如substring),这些方法在字符串之间共享支持表示形式,则在使用完完整密码字符串后,可以保留该字符串


但是,如果您担心的是其他Java代码能够看到已被占用或仍在内存中的旧密码,那么您不必担心。无法迭代或查看内部字符串池的元素,也无法打开字符串查看其支持数组。

杜德,请使用字符串缓冲区获取密码并对其执行(大概)字符串类型操作

StringBuffer将字符串存储为可以删除的char[]。或者被推翻或者你做了什么。 说
StringBuffer.delete(0,StringBuffer.length())


或者直接将db密码作为char[]来使用,但我认为StringBuffer方式(假设所有代码都是使用String方法编写的)会更容易实现。

char[]非常适合控制界面。如果您必须调用一个将密码作为字符串的方法,那么迟早会创建一个字符串对象…Java 1.8.20引入了一个后台字符串重复数据消除功能,它非常类似于让您的字符串在没有任何人调用intern()的情况下进行intern()…因为字符串是在,仍然要进行普通的垃圾收集,没有理由认为处理所有字符串,就好像在构造之后应用了
intern()
,应该会提高内存要求。实际上,堆中的字符串实例将更少。然而,这样做会导致性能灾难……从代码中查找这些字符串可能并不容易,但它们将位于heapdump中。如果我试图得到它们,我会尝试触发一个heapdump并尝试分离转储文件。