Java-未冷却字符串
有没有合法的方法可以强制JVM不将特定的Java-未冷却字符串,java,string,jvm,string-pool,Java,String,Jvm,String Pool,有没有合法的方法可以强制JVM不将特定的String实例存储在长期存在的字符串池中 newstring()是否提供了此功能,并且我可以100%确定,以这种方式创建的值将被放入堆中,而不是池中,除非我调用intern() 有没有合法的方法可以强制JVM不将特定的字符串实例存储在长期存在的字符串池中 除了不使用字符串文本初始化它之外,恐怕没有 new String()是否提供了此功能,并且我可以100%确定,以这种方式创建的值将被放入堆中,而不是池中,除非我调用intern() 是(请记住,如果您
String
实例存储在长期存在的字符串池中
newstring()
是否提供了此功能,并且我可以100%确定,以这种方式创建的值将被放入堆中,而不是池中,除非我调用intern()
是(请记住,如果您编写
String str1=new String(“Hello”);
,则str1
引用的String
实例将不会内部化,而为文本字符串创建的String
实例将内部化)
还请注意,池在堆中存储的确切位置取决于JVM的版本,如前所述,池仍然在堆中,长寿命对象将被GC-ed。控制台的readPassword()
方法为此返回char[]
。所以,“首先不要创建字符串”
“我会说。@daniu是的,实际上这就是我问这个问题的原因:)“而为文本字符串创建的字符串实例“Hello”
将”。我想我应该坚持使用原始的char[]
。如果您担心安全问题,您肯定应该使用char[]
,因为它可以被显式删除(通过覆盖其内容)。即使字符串
没有在字符串池中结束,也无法保证GC何时会收集它(即使这样,直到内存被其他对象重用,原始字节才会保留)@crizzis使用char[]
只是假装没有更高的安全性。在垃圾收集堆中,可以有任意数量的副本四处飞舞,而您只覆盖其中一个副本。此外,作为数组的最后一个操作覆盖它,可能会被JVM优化。@Holger也许我把我的观点过于简化了。更详细地讨论了subjectOne选项是使用直接ByteBuffer获取安全信息,例如私钥。这将只在内存中的一个位置,不使用时可以覆盖。