Rav*_*pta 23 java string performance garbage-collection
如果我使用String.intern()来提高性能,因为我可以使用"=="来比较实习字符串,我会遇到垃圾收集问题吗?实习字符串的垃圾收集机制与普通字符串有何不同?
Tho*_*nin 21
String.intern()管理一个内部的,本机实现的池,它具有一些特殊的GC相关功能.这是旧代码,但如果它重新实现,它将使用a java.util.WeakHashMap.弱引用是一种保持指向对象的指针而不阻止它被收集的方法.对于统一池,如实习字符串,这是正确的事情.
可以使用以下Java代码演示可以使用垃圾收集的实际字符串:
public class InternedStringsAreCollected {
    public static void main(String[] args)
    {
        for (int i = 0; i < 30; i ++) {
            foo();  
            System.gc();
        }   
    }
    private static void foo()
    {
        char[] tc = new char[10];
        for (int i = 0; i < tc.length; i ++)
            tc[i] = (char)(i * 136757);
        String s = new String(tc).intern();
        System.out.println(System.identityHashCode(s));
    }
}
此代码创建相同字符串的30倍,每次实习.此外,它还用于System.identityHashCode()显示Object.hashCode()在该实习字符串上返回的哈希代码.运行时,此代码打印出不同的整数值,这意味着每次都不会获得相同的实例.
无论如何,使用String.intern()有点气馁.它是一个共享的静态池,这意味着它很容易成为多核系统的瓶颈.使用String.equals()比较字符串,你会活得更长,更快乐.
Rid*_*del 11
实际上,这不是垃圾收集优化,而是字符串池优化.当您调用时String.intern(),将初始String的引用替换为其基本引用(第一次遇到此字符串的引用,或者此引用(如果尚未知)).
但是,一旦您的字符串在应用程序中不再使用,它将成为垃圾收集器问题,因为实习字符串池是String类的静态成员,并且永远不会被垃圾回收.
根据经验,我认为从不使用这个实习方法,并且让编译器仅将它用于常量字符串,这些声明如下:
String myString = "a constant that will be interned";
这是更好的,在某种意义上它不会让你做错假设==可以工作,当它不会.
此外,事实是String.equals潜在地==称为优化,确保在引擎盖下使用实习字符串优化.这是一个更多的证据==应该永远被串上使用.
| 归档时间: | 
 | 
| 查看次数: | 6504 次 | 
| 最近记录: |