2017-09-06 1 views
0

두 파일 A와 B가 있고 데이터가 둘 다 (스트림과 같이) 연속적으로 기록되는 상황이 있습니다.Java에서 사용자 제어 캐시 퇴거/가비지 수집을 수행하는 방법은 무엇입니까?

이제 파일 A와 B가 모두 메모리를 차지하려고하고 가비지 수집기가 대체 될 파일의 ​​페이지를 결정할 것임을 알고 있습니다.

가비지 수집기 선호 파일 A (예 : 가비지 수집기는 항상 A와 비교하여 파일 B의 페이지를 제거해야 함)를 만들어 가비지 수집을 제어하려고합니다. 다른 가능성은 메모리에 캐싱하지 않고 파일 B를 디스크에 강제로 쓰는 것입니다.

Java에서 이러한 일이 발생할 수 있습니까?

답변

1

입니다. 예, 가비지 수집은 메모리 관리의 한 형태이지만, "메모리 공간이 부족할 때 어떤 페이지의 메모리가 디스크로 스왑 될지"를 논의 할 때 말하는 것이 아닙니다. 가비지 수집은 가비지 수집이 아닙니다. A와 B 파일. 가비지 콜렉터는 오브젝트에 대한 참조가 없을 때까지 아무 작업도 수행하지 않습니다.

가비지 수집이 아닌 메모리 페이지 스왑을 제어하려고합니다. 나는 이것이 틀렸다면 나는 주석으로 고쳐질 것이라고 확신하지만, 메모리가 부족할 때 어떤 페이지의 메모리가 디스크로 바뀌 었는지 자바에서 제어 할 수 있다고 생각하지 않는다.

1

가비지 수집을 Java에 강제로 요청할 수 없습니다.

그러나 System.gc()으로 전화를 걸어 JVM에게 가비지 수집을 요청할 수 있습니다.

개체에 가비지 수집을 준비하려면 null에 할당 할 수 있습니다. 그렇게하면 가비지 수집기가 실행될 때이 객체를 가져오고 힙에서 제거됩니다.

0

Java는 자동 가비지 수집을 사용하여 사용중인 객체와 사용되지 않은 객체를 식별하고 사용되지 않는 객체를 삭제합니다.

자바 내에서 가비지 컬렉션에 대한 좋은 소스는 당신이 가비지 컬렉션으로 메모리 관리를 혼동 의심 here

0

문제에 대한 설명에 특정 세부 정보가 없습니다. 구체적으로 파일 순차 쓰기 또는 임의 액세스가 관련되어 있습니까?

geneSummons가 올바르게 지적 했으므로 운영 체제의 메모리 관리와 JVM의 메모리 관리를 혼동하게됩니다. sun.misc.Unsafe조차도 자바 애플리케이션의 OS 레벨에서 페이징 활동을 제어 할 수 없습니다.

당신은 일 수 있습니다.은 메모리 맵 파일을 사용하지만, 쓰기 작업에 임의 액세스를 사용하는지 여부에 따라 달라집니다. 당신이하고있는 모든 일이 순차적으로 쓰는 것이라면 이것은 거의 쓸모가 없을 것입니다. 이것은 OS 레벨에서 파일 페이징을 제어 할 수는 없지만 문제를 해결하는보다 효율적인 방법을 제공 할 수 있습니다.

이 주제에 대한 유용한 기사가 있습니다. https://howtodoinjava.com/java-7/nio/java-nio-2-0-memory-mapped-files-mappedbytebuffer-tutorial/

관련 문제