LRU는 Least Recently Used의 약자로, 간단하게 최근에 사용된 넘을 캐시에 유지한다는 것이 LRUCache 입니다..
간단하게 아래와 같이 만들 수 있습니다.
1. 코드 속에서 간단하게 만들기..
2. LinkedHashMap을 이용해서 만들기..
보통 위에처럼 하게 되면 그냥 됩니다..
그러다가 점점 메모리 릭이 납니다.. ^^;;
그래서 해결책을 찾아보니, https://code.google.com/p/reflection-dsl/source/browse/trunk/ReflectionDsl/src/br/com/bit/ideias/reflection/cache/LRUCache.java?spec=svn204&r=204 에서는 Value에 해당하는 객체를 SoftReference로 래핑해서 땜빵(?)하고 있네요.. ^^;;
그래서 저같은 경우에는 명시적으로 객체를 삭제하는 코드를 입력해서 사용하고 있습니다.
아래의 코드를 통해서 잠재적으로 발생할 수 있는 메모리릭을 없애 주세요.. ^^
간단하게 아래와 같이 만들 수 있습니다.
1. 코드 속에서 간단하게 만들기..
final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
// This method is called just after a new entry has been added
public boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
};
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
// This method is called just after a new entry has been added
public boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
};
2. LinkedHashMap을 이용해서 만들기..
public class LRUCache<K,V> extends LinkedHashMap<K,V> {
private int lruSize;
public LRUCache(int size) {
lruSize = size;
}
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > lruSize;
}
}
private int lruSize;
public LRUCache(int size) {
lruSize = size;
}
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > lruSize;
}
}
보통 위에처럼 하게 되면 그냥 됩니다..
그러다가 점점 메모리 릭이 납니다.. ^^;;
그래서 해결책을 찾아보니, https://code.google.com/p/reflection-dsl/source/browse/trunk/ReflectionDsl/src/br/com/bit/ideias/reflection/cache/LRUCache.java?spec=svn204&r=204 에서는 Value에 해당하는 객체를 SoftReference로 래핑해서 땜빵(?)하고 있네요.. ^^;;
그래서 저같은 경우에는 명시적으로 객체를 삭제하는 코드를 입력해서 사용하고 있습니다.
아래의 코드를 통해서 잠재적으로 발생할 수 있는 메모리릭을 없애 주세요.. ^^
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
boolean isRemove = size() > maxsize;
if (isRemove) {
Object obj = this.get(eldest.getKey());
if(obj instanceof BufferedWriter) { // V가 BufferedWriter 인스턴스임..
try {
((BufferedWriter)obj).close();
} catch (IOException e) {
e.printStackTrace();
}
}
this.remove(eldest.getKey());
}
return isRemove;
}
boolean isRemove = size() > maxsize;
if (isRemove) {
Object obj = this.get(eldest.getKey());
if(obj instanceof BufferedWriter) { // V가 BufferedWriter 인스턴스임..
try {
((BufferedWriter)obj).close();
} catch (IOException e) {
e.printStackTrace();
}
}
this.remove(eldest.getKey());
}
return isRemove;
}
'Java' 카테고리의 다른 글
| Ubuntu 11.10에 JDK 설치하기.. (3) | 2011/11/05 |
|---|---|
| Updater/Launcher using jnlp (0) | 2011/07/18 |
| Java에서 LRUCache 사용과 문제 그리고 해결방안 (0) | 2011/03/02 |
| java nio scatter/gater (0) | 2010/12/07 |
| non-blocking SocketChannel에서 read() timeout 처리하기.. (0) | 2010/09/17 |