2010-04-05 5 views
1

Java에서 메모리 맵핑 된 일부 파일을보고 있습니다. 예를 들어, 힙 크기를 2GB로 설정하고 메모리에 50GB 인 파일을 매핑한다고 가정 해 보겠습니다. 실제로 컴퓨터의 실제 메모리보다 많습니다. OS는 os 파일 캐시에 50GB 파일의 일부를 캐시합니다. Java 프로세스에는 2GB의 힙 공간이 있습니다. 내가 궁금한 점은 OS가 캐시 할 50GB 파일의 양을 어떻게 결정 하는가?Java 메모리 맵핑 파일 및 스왑

예를 들어 2GB 힙 크기의 Java 프로세스가있는 경우 메모리 매핑 된 파일의 일부를 캐시 할 수 있도록 2GB가 스왑 아웃됩니까? OS가 캐시 할 수 있도록 첫 번째 프로세스의 힙 공간 일부가 스왑 아웃됩니까?

운영 체제 캐싱을 위해 힙 공간을 바꾸지 않도록 OS에 알리는 방법이 있습니까? OS가 메인 프로세스를 스왑 아웃하지 않는다면, 파일 캐시의 크기를 어떻게 결정할 수 있습니까?

답변

2

리눅스는 익명 매핑 된 페이지와 메모리 매핑 된 페이지를 구분하지 않습니다. 어쨌든 페이지 폴트를 통해로드됩니다.

익명 메모리는/dev/zero의 개인 메모리 매핑 인 것처럼 생각할 수 있습니다.

그래서 원하는만큼 맵핑 할 수 있습니다 (주소 공간 허가, 여기서는 64 비트 박스에 있다고 가정합니다). 리눅스는 프로세스가 페이지 폴트를 통해 접근 할 때만로드한다.

마찬가지로 페이지는 최근에 페이지가 사용 된 기록을 보관하여 버려 지도록 우선 순위가 지정됩니다.

파일 매핑이 MAP_SHARED 인 경우 유일한 차이점은 다른 것들을 위해 더 많은 공간을 확보하기 위해 버려지는 페이지는 스왑 영역에 쓰지 않아도됩니다. 원본 파일.

질문에 대답하자면 페이지를 읽거나 쓰지 않는 한 대용량 파일을 매핑해도 다른 사람이 가상 메모리를 사용할 수 없습니다.

관련 문제