[Memory] thrashing

thrashing :
메모리 할당 -> 원하는 크기의 메모리 block이 없음 -> Memory 부족으로 -> Page Fault가 빈번하게 일어나는 상태(LRU alg로 오래된 page 추방)

원인 : 메모리 부족 -> system call로 조그만한 메모리 block 할당 -> 메모리 단편화(fragmentation) 발생 -> 단편화 조각보다 큰 메모리를 요청한 경우 메모리 부족으로 page fault 발생 -> 잦은 I/O -> CPU자원을 활용하기 어려움.

해결방법 : RAM Size UP, Block 단위의 메모리 공간 할당, 사용, 반납

VM기반의 Java보다는 system call을 사용하는 C++에서 이런 현상이 자주 발생한다고 한다.
http://stackoverflow.com/questions/60871/how-to-solve-memory-fragmentation

문제를 겪고 있는 프로그래머가 3가지 방법 중 가장 좋은 대안을 물어보았다.

1) Use Windows Low-fragmentation Heap

2) jemalloc – as used in Firefox 3

3) Doug Lea’s malloc

본문 내용의 일부를 발췌하여 요약하면
-> 비슷한 life time을 가진 동적 메모리를 비슷한 heap에 할당하여 관리 하는 것이 메모리 단편화를 막는데 효율적이라고 말한다. 그럼 용도에 맞는 Heap을 관리해야 한다고 하는데 

Why are you having a fragmentation problem? – Sources of fragmentation problems are caused by the behavior of an application and have to do with greatly different allocation lifetimes in the same memory arena. That is, some objects are allocated and freed regularly while other types of objects persist for extended periods of time all in the same heap…..think of the longer lifetime ones as poking holes into larger areas of the arena and thereby preventing the coalesce of adjacent blocks that have been freed.

To address this type of problem, the best thing you can do is logically divide the heap into sub arenas where the lifetimes are more similar. In effect, you want a transient heap and a persistent heap or heaps that group things of similar lifetimes.

아래 댓글을 읽어보면 흥미있는 대화를 하고 있는데 persistent, transient heap을 나눈 것이 일반적인 Garbage collection 정책과 유사한 것이 아니냐 라고 물어보니…

가장 높은 점수를 받은 저자가 embedded에서는 꽤 잘 알려진 사용 방식이라고 말하는 것으로 보아 embedded 개발자로 보인다. 

직접 써봐야 메모리 관리가 얼마나 어려운지 생산성은 얼마나 되는지, 안정적으로 메모리 운용이 가능한지 알 수 있을 것 같다.

말이 나온김이 Java GC 정책에 대해 정리하는 시간을 갖는 것이 좋겠다.