잘못된 추상화 수준에서 작업하고 있습니다.
자바 (및 아마도 .NET)는 원시 포인터가 아닌 핸들을 사용하는 객체를 참조합니다. 기본 Java VM은 언제든지 가상 메모리에서 객체를 이동할 수 있습니다. 자바 애플리케이션은 차이점을 보지 못한다.
Win32 및 Linux 응용 프로그램 (예 : Java VM)은 가상 주소를 사용하여 메모리를 참조합니다. 가상 주소에서 RAM 칩의 실제 주소로의 매핑이 있습니다. 커널은 언제든지이 매핑을 변경할 수 있습니다 (예 : 데이터가 디스크로 페이징 된 후 다른 메모리 위치로 다시 읽혀지는 경우). 응용 프로그램은 아무런 차이를 느끼지 않습니다.
Java 및.NET, 나는 이것을 달성하기 위해 Java/.NET 응용 프로그램을 변경하지 않을 것입니다. 대신 기본 Linux 커널 또는 Java VM을 변경합니다.
프로토 타입의 경우 한 가지 방법은 mem = 매개 변수를 사용하여 Linux를 부팅하여 커널의 메모리 사용량을 보유한 메모리 양보다 적게 제한 한 다음 예비 메모리를 mmap 할 수 있는지 여부를 조사하는 것입니다 (매핑/dev/mem을 루트로 사용 하시겠습니까?). 그런 다음 Java VM에서 malloc()에 대한 모든 호출을 변경하여 여유 공간에서 할당하는 고유 한 메모리 할당자를 사용할 수 있습니다.
실제로 구현하려면 커널을 변경하고 사용자 공간 호환성을 유지해야합니다. memory hotplug in Linux에서 완료된 작업을 확인하십시오. http://lhms.sourceforge.net/
정말 매력적입니다. 더 가까운 메모리 세그먼트로 인해 에너지 소비가 감소한다는 사실을 뒷받침하는 문서가 있습니까? –
더 중요한 것은 보조 저장 장치에 대해 동일한 작업을 수행하는 것입니다. 즉, 다른 파일 시스템 및 파일 할당 전략의 에너지 소비를 측정합니다 (현재 기계식 HDD는 검색 할 때 더 많은 에너지를 소모하기 때문에). –