Çok sayıda yinelenen Dizeye sahip bir uygulama üzerinde çalışıyorum ve görevim bunları bellek kullanımını azaltmak için ortadan kaldırmaktır. İlk düşüncem, bir String'in sadece bir referansının mevcut olacağını garanti etmek için String.intern
'u kullanmaktı. Yığın belleğini azaltmak için çalıştı, ancak PermGen yolunu çok artırdı; Aslında, yalnızca bir kez bildirilen birçok dizeler olduğu için, uygulamanın kullandığı toplam bellek miktarı artmıştır.Bellek kullanımını artırmadan her zaman bir String'e aynı referansı kullanmak için kodu nasıl optimize edebilirim?
Başka bir fikir ararken, şu yaklaşımı buldum: https://stackoverflow.com/a/725822/1384913.
String.intern ile aynı şey oldu: Dize kullanımı azaldı, ancak kaydettiğim bellek WeakHashMap
ve WeakHashMap$Entry
sınıflarında kullanılıyor.
Yapmakta olduğum miktarda bellek harcayan her bir String için yalnızca bir referansı korumanın etkili bir yolu var mı?
Bir 'WeakHashMap' kokan Yeterince hafıza kurtaracak, muhtemelen bunu yapmanın bir yolu yoktur. Bir 'WeakHashMap', gerçekçi bir şekilde, 'String'i belirli bir değer için aramak için çok fazla çalışma zamanına mal olmayacak tek çözüm olacak. –
Benzer bir soruya verdiğim yanıta da bakabilirsiniz http://stackoverflow.com/a/12793823/57695 –
Açık bir nokta, ancak farklı Strings kaynaklarını sınıflandırabiliyorsanız (örneğin, çok fazla yinelenenler arasında ayrım yapabilirsiniz) Bir keresinde kullanılanlara karşı) daha sonra bunu daha verimli yapabilirsiniz. Bu sizin uygulama için mümkün olmayabilir ... – DNA