[
https://issues.apache.org/jira/browse/LUCENENET-106?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12665231#action_12665231
]
Digy commented on LUCENENET-106:
--------------------------------
Hi Eyal,
To simplify the code, I'd suggest another variant of your code: Instead of
implementing whole IDictionary, inheriting from Hashtable and overriding
necessary methods only.
A sample code is below. The only method which is different is "GetEnumerator"
{code}
public class WeakHashTable : Hashtable
{
class WeakComparer : IEqualityComparer
{
static WeakComparer _instance;
static WeakComparer()
{
_instance = new WeakComparer();
}
bool IEqualityComparer.Equals(object x, object y)
{
if (x == y)
return true;
if (x is WeakKey)
{
x = ((WeakKey)x).Target;
if (x == null)
return false;
}
if (y is WeakKey)
{
y = ((WeakKey)y).Target;
if (y == null)
return false;
}
return x.Equals(y);
}
int IEqualityComparer.GetHashCode(object obj)
{
return obj.GetHashCode();
}
public static WeakComparer Instance
{
get
{
return _instance;
}
}
}
class WeakKey : WeakReference
{
int hashCode;
public WeakKey(object key)
: base(key)
{
if (key == null)
throw new ArgumentNullException("key");
hashCode = key.GetHashCode();
}
public override int GetHashCode()
{
return hashCode;
}
}
WeakReference collectableObject = new WeakReference(new Object());
public WeakHashTable() : base(WeakComparer.Instance)
{
}
private void CleanIfNeeded()
{
if (collectableObject.Target == null)
{
Clean();
collectableObject = new WeakReference(new Object());
}
}
private void Clean()
{
ArrayList keysToDelete = new ArrayList();
foreach (WeakKey wtk in base.Keys)
{
if (!wtk.IsAlive)
{
keysToDelete.Add(wtk);
}
}
foreach (WeakKey wtk in keysToDelete)
base.Remove(wtk);
}
public override void Add(object key, object value)
{
CleanIfNeeded();
base.Add(new WeakKey(key), value);
}
public override IDictionaryEnumerator GetEnumerator()
{
System.Collections.Hashtable dictEntires = new Hashtable();
foreach (WeakKey key in base.Keys)
{
object realKey = key.Target;
if (realKey != null)
dictEntires.Add( realKey,base[realKey] );
}
return dictEntires.GetEnumerator();
}
public override ICollection Keys
{
get
{
ArrayList keys = new ArrayList(Count);
foreach (WeakKey key in base.Keys)
{
object realKey = key.Target;
if (realKey != null)
keys.Add(realKey);
}
return keys;
}
}
public override object this[object key]
{
get
{
return base[key];
}
set
{
CleanIfNeeded();
base[new WeakKey(key)] = value;
}
}
public override void CopyTo(Array array, int index)
{
int arrayIndex = index;
foreach (object key in Keys)
{
DictionaryEntry de = new DictionaryEntry(key, this[key]);
array.SetValue(de, arrayIndex++);
}
}
public override int Count
{
get
{
CleanIfNeeded();
return base.Count;
}
}
}
{code}
DIGY
> Lucene.NET (Revision: 603121) is leaking memory
> -----------------------------------------------
>
> Key: LUCENENET-106
> URL: https://issues.apache.org/jira/browse/LUCENENET-106
> Project: Lucene.Net
> Issue Type: Bug
> Environment: .NET 2.0
> Reporter: Anton K.
> Assignee: Digy
> Priority: Critical
> Attachments: DIGY-FieldCacheImpl.patch, Digy.rar,
> luceneSrc_memUsage.patch, Paches for v2.3.1.rar, WeakHashTable v2.patch,
> WeakHashTable v2.patch, WeakHashTable+FieldCacheImpl.rar,
> WeakHashTable_ep.zip, WeakHashTable_tj.zip, WeakReferences.rar
>
>
> readerCache Hashtable field (see FieldCacheImpl.cs) never releases some hash
> items that have closed IndexReader object as a key. So a lot of Term
> instances are never released.
> Java version of Lucene uses WeakHashMap and therefore doesn't have this
> problem.
> This bug can be reproduced only when Sort functionality used during search.
> See following link for additional information.
> http://www.gossamer-threads.com/lists/lucene/java-user/55681
> Steps to reproduce:
> 1)Create index
> 2) Modify index by IndexWiter; Close IndexWriter
> 3) Use IndexSearcher for searching with Sort; Close InexSearcher
> 4) Go to step 2
> You'll get OutOfMemoryException after some time of running this algorithm.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.