2013-04-15 4 views
3

GC 안에 JVM 사이의 collaboration과 메모리 페이징을 이해하려고합니다. 나는 4GB RAM이 있고 1.2GB for JVM가 할당 된 linux 상자가 있습니다. 과도한 메모리가 필요한 응용 프로그램을 실행하면 메모리 페이징이 발생하고 실제로 메모리 부족 오류가 발생하면 throws 오류가 발생합니다. 객체가 생성되면 힙에 생성되고 사용되지 않는 경우 가비지 수집되거나 응용 프로그램에서 사용되는 경우 살아 있습니다.가비지 수집 + 메모리 페이징

그럼 내 질문은 언제부터 JVM에 대한 메모리 페이징을 시작하고 OS에 의해 호출되는 라이브 개체가 발생합니까?

또한 OS 페이지가 Java 객체를 사용하는 경우 먼저 어떤 객체를 페이징해야하는지 우선 순위를 매기는 방법은 무엇입니까? 그것은 대부분의 메모리를 차지하고있는 객체를 페이징합니까?

답변

1

첫 번째 메모리 페이징은 JVM이 아닌 기본 OS에서 처리합니다.

디 프래그먼트를 의미한다면 예 JVM이이를 처리합니다. This은 수명이 긴 오브젝트를 다른 세대로 전송하여 이동 중에 조각 모음을하지 않는 가비지 수집기에서 처리하는 방법에 대해 더 많은 정보를 제공합니다. 이는 명백하게 어떤 객체가 페이지 아웃되는지 여부에 영향을 미칩니다. 하지만 이것은 객체의 수명을 연장하거나 단축하여 보유하고있는 최대 간접 제어입니다.

그리고 메모리 힙마다 더 이상 공간이 남아 있지 않습니다.

+0

답장을 보내 주셔서 감사합니다. OS가 페이징을 처리하고 GC가 객체를 YG에서 OG로 이동하여 메모리 관리를 처리한다는 것을 알고 있습니다. 내 질문은 운영 체제 측면에서 메모리 페이징이 발생하고 페이징 된 객체가 OS와 JVM간에 어떻게 처리되는 것입니까? – user826323

+0

OS의 경우 JVM 프로세스는 특별한 액세스가없는 다른 프로세스와 같습니다. 따라서 JVM이 현재 가상 메모리에있는 객체에 액세스하려고 할 때, OS는 가상 메모리에서 객체를 다시 전송하여 사용 가능하게 만듭니다. 한편, OS는 일부 오브젝트 내용을 가상 메모리로 전송할 수 있습니다. 당신이 알고 싶다면, JVM이 운영체제에 콘텐트를 가져오고 다른 페이지를 가져 오는 것에 기반하여 주소에 객체를 놓으라는 OS를 요청할 때 발생한다. – Jatin

2

짧은 대답은 JVM이 OS가 힙을 스왑하거나 스왑 핑을 방지한다는 사실을 전혀 알 수 없다는 것입니다.

더 정확하게 말하면, JVM 플래그를 켜서 스와핑을 방지 할 수 있지만 (-XX:+UseLargePages) OS에 큰 페이지가 부족하면 일반 스와핑으로 되돌아갑니다. 또한 모든 GC주기는 모든 페이지를 RAM으로 가져와 검사 할 수 있도록합니다. 그래서 기본적으로, 스와핑 + 풀 GC = 당신은 Stop-The-World의 지옥에 뛰어 들어갈 것입니다.

G1은 죽은 개체로 채워지는 메모리 영역을 먼저 수집하지만 페이지 폴트로 인해 더 많은 시간이 소요되기 때문에 약간 다른 동작을 보입니다.

희망 하시겠습니까?

+0

고마워. OS가 페이징을 처리하는 경우 왜 OutOfMemory가 발생합니까? – user826323

+0

글쎄, OutOfMemoryError는 힙 (1.2GB)이 생성 한 모든 객체를 저장할 정도로 크지 않으며 페이징에 직접 연결되지 않는다는 것을 의미합니다. –