Eclipse와 Firefox의 Swapping 문제
몇주 전 회사의 동료가 추천한 Eclipse의 plug-in을 이제야 써봤다. KeepResident Eclipse Plugin 예전부터 Eclipse를 minimize해두었다가 사용하려고 할 때 많이 버벅거리는 것이 Windows NT/2K/XP의 가상 메모리 관리 방식 및 Java의 메모리 관리 방식과 관계가 있는 줄 알고 있었지만, 그걸 plug-in으로 해결하는 방법이 있는 줄은 몰랐었다. 이 plug-in의 저자에 따르면
The performance of Eclipse (and other large Java applications) has long suffered due to the Windows virtual memory manager. Windows has a tendency to preemptively swap Java processes out of physical memory, even when there is still plenty of physical memory available. This interacts very poorly with Java processes, which do not have good locality and touch a lot of memory. The problem is exacerbated when Java performs garbage collection, which causes the Java process to touch lots of memory that has been paged out to disk. Ever had Eclipse randomly hang for 15-20 seconds? This is most likely the culprit.
Kernel과 GUI가 분리되어 있는 UNIX와는 달리, Win32 계열의 커널에서는 프로그램이 minimize될 때 이 프로그램의 working set을 OS가 알아서 최소화시켜 버리기 때문에 약간의 파일 I/O만으로도 이 프로그램이 사용하던 메모리가 모두 discard되어 버리고, 이 때문에 프로그램이 다시 restore/maximize될 때 버벅거리는 것이다. Java의 경우엔 더군다나 클래스 파일, JIT된 네이티브 코드 및 오브젝트가 메모리에 여기 저기 흩어져 있고 특히 garbage collection이라도 하게 되면 전체 virtual memory를 다 랜덤 액세스하게 되므로 demand loading의 performance가 매우 나쁘게 되어 차라리 다시 띄우는 것이 더 나은 경우도 많게 되는 것이다. Windows의 작업 관리자에서 “최고 메모리 사용률"을 보이게 하고 Eclipse의 javaw를 선택한 후 Eclipse를 minimize해보면, “최고 메모리 사용률"은 그대로 있지만 “메모리 사용"은 많이 줄어드는 것을 볼 수 있는데, 위의 plug-in을 설치하고 나면 “최고 메모리 사용률"이 유지되는 것을 볼 수 있고, 충분히 체감도 할 수 있다. 하지만 working set을 유지하기 위해 VirtualLock()을 사용하는 것은 메모리가 충분하지 않은 컴퓨터에서는 전체 시스템의 성능에 많은 영향을 줄 수 있으므로 주의해서 사용해야 할 것 같다. NT 커널의 virtual memory가 swapping하는데 FIFO 알고리즘을 사용하기 때문에 성능이 좋지 않다는 얘기는 예전에도 들은 적이 있지만, 다른 대부분의 애플리케이션에서는 큰 문제가 안되기 때문에 꼭 OS만의 문제라고 치부하기는 어렵다. 마이크로소프트의 관련 설명을 보면 이를 피해가는 방법이 있는데 Sun에서는 Java 5.0에 와서야 선택적으로 이 방법을 사용할 수 있게 했다(System property sun.awt.keepWorkingSetOnMinimize=“true”. AWT가 아닌 SWT를 사용하는 Eclipse에는 적용 안됨). Eclipse나 다른 Java 기반의 프로그램 외에 Mozilla/Firefox의 경우에도 비슷한 문제가 있는데, 관심있는 사람들은 좀 길긴 하지만 이 bugzilla entry를 보면 많은 걸 배울 수 있다. 해결책에만 관심있는 사람은
- Mozilla/Firefox의 주소 필드에 about:config를 입력하고,
- 이 창에서 마우스 우측 버튼을 누른 후 “New"를 선택
- “Boolean” 타입을 선택하고
- Preference 이름으로 config.trim_on_minimize를 입력한 후 값을 false로 지정
- 브라우저를 재시작
하고 Eclipse의 경우와 마찬가지로 작업 관리자에서 메모리 사용량을 확인해보면 차이를 볼 수 있다. MS에서 비록 선택적으로 피해가는 방법을 제공하고 있기는 하지만, 이러한 문제의 원인과 해결책을 별로 열심히 알리고 있는 것 같지는 않고 또 OS 레벨에서 이런 문제를 해결하기 위한 대책을 적극적으로 강구하는 것 같지도 않다. 이 문제의 가장 많은 영향을 받는 애플리케이션이 Java와 Mozilla/Firefox라는 것은 단순히 우연일까? 하인라인이 “Never attribute to malice which can be explained by stupidity.“라고 했다지만 그게 Microsoft에도 적용되는 얘기일까? 사회 생활을 하다보니 오히려 “무지를 가장한 악의"도 많이 눈에 띄는 것 같다. 추가: 이상하게 이 글에만 자꾸 스팸 덧글이 붙어서 덧글 막습니다.