Java-未冷却字符串

Java-未冷却字符串,java,string,jvm,string-pool,Java,String,Jvm,String Pool,有没有合法的方法可以强制JVM不将特定的String实例存储在长期存在的字符串池中 newstring()是否提供了此功能,并且我可以100%确定,以这种方式创建的值将被放入堆中,而不是池中,除非我调用intern() 有没有合法的方法可以强制JVM不将特定的字符串实例存储在长期存在的字符串池中 除了不使用字符串文本初始化它之外,恐怕没有 new String()是否提供了此功能,并且我可以100%确定,以这种方式创建的值将被放入堆中,而不是池中,除非我调用intern() 是(请记住,如果您

有没有合法的方法可以强制JVM不将特定的
String
实例存储在长期存在的字符串池中

  • newstring()
    是否提供了此功能,并且我可以100%确定,以这种方式创建的值将被放入堆中,而不是池中,除非我调用
    intern()

  • 有没有合法的方法可以强制JVM不将特定的字符串实例存储在长期存在的字符串池中

    除了不使用字符串文本初始化它之外,恐怕没有

    new String()是否提供了此功能,并且我可以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获取安全信息,例如私钥。这将只在内存中的一个位置,不使用时可以覆盖。