2010-01-12 3 views

답변

29

개체에는 시작 개체를 포함한 다른 개체에 대한 참조가있는 다른 개체에 대한 참조가 있습니다. 이는 도달 가능성 분석에 유용한 객체의 그래프를 생성합니다. 예를 들어 시작 객체가 도달 가능한 경우 (스레드의 로컬 스택에 있다고 가정하면) 그래프의 모든 객체에 접근 할 수 있으며 정확한 가비지 수집기는 이러한 객체를 수확 할 수 없습니다. 비슷하게, 도달 가능한 모든 객체의 목록을 생성하면 살아있는 객체 (뿌리) 집합으로 시작하여 다른 모든 객체는 수집을위한 쓰레기 공정한 게임입니다.

+1

Re "not all": 모든 객체는 클래스에 대한 참조를 제외하고는 다른 객체에 대한 참조를 가지고 있다고 생각합니다. – Thilo

+0

@Thilo : 좋은 지적입니다. 나는 "모두가 아니라"를 제거했습니다. –

+0

아마 원시 타입 배열하지 않을 수 있습니다 ... – Thilo

5

개체 그래프는 기본적으로 도달하고있는 개체를 결정하는 데 사용되는 오브젝트

사이의 의존성 그래프가있는 것은 모두 도달 할 수없는 객체는 가비지 컬렉션 대상이 될 수 있도록.

+0

누군가가이 답변에 투표 할 이유가 무엇입니까 :) –

+0

잘 모르겠습니다. 도달 가능성 그래프를 종속성 그래프로 설명했기 때문에 downvote 경향이 있습니다 .-) –

14

'개체 그래프'는 개체 모델 (프로그램의 클래스)에있는 개체의 모든 인스턴스와 그 상호 연결을 개념화 한 것입니다. 예를 들어

테이크 : 당신이 그들을, Foo myFoo을 인스턴스를 만든 다음 Bar myBar의 인스턴스를 생성하고 연결한다면

당신은 myFoo.aBar = myBar;, 두 개의 클래스

Class Foo 
{ 
    String aString = "foo"; 
    Bar aBar; 
} 

Class Bar 
{ 
    String aString = "boo"; 
} 

이, 개체 그래프는 것 단일 인스턴스 인 Bar을 참조하는 Foo의 단일 인스턴스로 구성됩니다.

가비지 수집기는 기본적으로 객체 그래프를 사용하여 메모리의 어떤 인스턴스가 프로그램에 의해 필요하고 무엇인가에 연결되어 있는지 그리고 더 이상 액세스 할 수 없으므로 삭제할 수 있는지를 결정합니다. wikipedia


누군가가 나보다 더 설득력을두고 :

객체 지향 응용 프로그램은 상호 객체의 복잡한 웹을 포함한다. 개체가 개체 하나가 서로 연결되어 있거나 다른 개체를 소유하거나 포함하고 있거나 다른 개체에 참조를 보유하고있는 개체입니다. 이 객체들의 웹 인 은 객체 그래프 (object graph)라고 불리우며, 보다 추상적 인 구조 인 이 응용 프로그램의 상태를 설명하는 데 사용될 수 있습니다.

6

우리가 이야기하는 것은 노드를 연결하는 노드와 에지로 구성된 유향 그래프의 수학적 개념입니다. 객체 그래프는 노드가 객체이고 에지가 객체 간의 관심 관계 인 그래프입니다.

자바 가비지 컬렉터의 경우 관심 대상 그래프는 도달 가능한 객체의 그래프입니다. 이 그래프에서 노드는 Java 객체이고 가장자리는 실행중인 프로그램이 주어진 객체에서 다른 객체에 "도달"할 수 있도록하는 명시 적 또는 암시 적 참조입니다. (묵시적 참조의 예를 들어, 객체에서 Class 객체로의 묵시적인 참조가 있고 따라서 클래스 statics와 그 코드를 담고있는 힙 객체에 대한 암시적인 참조가 있습니다. 그러나 나는 빗나갑니다.)

@Chandra Patni가 설명했듯이 가비지 수집은 시작점 집합 중 하나에서 도달 할 수있는 모든 개체로 구성된 도달 가능성 그래프를 탐색하여 작동합니다. GC 용어의 "루트 집합". 이 그래프 탐색에서 찾을 수없는 모든 객체는 더 이상 계산에 영향을 미치지 않으므로 가비지 수집 될 수 있습니다.

0

우리가 알고있는 것처럼 객체는 클래스의 인스턴스입니다. 개체가 다른 개체에 대한 참조를 가질 수 있습니다 (주소 지정을 위해 포인터 사용). 또한 이러한 개체는 서로 다른 개체를 참조 할 수 있으므로 서로의 개체 계층 구조를 참조 할 수 있습니다.

이것은 개체 그래프입니다.

0

개체 그래프는 현재 메모리에있는 응용 프로그램/소프트웨어 클래스의 인스턴스 네트워크입니다. http://blog.ploeh.dk/content/binary/Windows-Live-Writer/Compose-object-graphs-with-confidence_921A/Tree_1.png

그것도 단 하나의 객체 그래프에 오브젝트 장쇄 될 수

클릭 화상을 참조한다. 예 : 응용 프로그램에서 PetDog, Owner, PetKennel과 같은 클래스가 있다고 가정 해 보겠습니다. 이제 PetDog에는 소유자가 있고 소유자에게는 PetDog가 하나 이상 있습니다. PetDog는 PetKennel에서 교육 받았으며 PetKennel은 많은 PedDog을 교육합니다. 이제 Object Oriented Approach에서 이러한 관계를 구현할 때, Owner (소유자 클래스의 인스턴스/객체)는 많은 PetDog 인스턴스를 참조 (링크) 할 수 있습니다 (다른 개가 많은 경우 PetDog 하나만 참조) 다시 한 번 PetDog는 특정 소유자 인스턴스/개체를 참조합니다 (즉, 귀하는 귀하의 강아지 케이스에, John 씨는 그의 강아지에 의해 참조됩니다). 귀하는 다른 개집 클럽에서 개를 사지 않았을 수도 있습니다 훈련 및 판매), 각 켄넬 클럽에 연결된 PetDog 인스턴스/객체를 참조/연결합니다. 이것은 서로 관련된 복잡한 객체 네트워크를 만듭니다.

노트/스케치 북의 각 인스턴스/개체 (PetDog, Owner, PetKennel의 각 개체)를 노트/스케치 북의 원/정사각형 (또는 모든 모양)으로 나타내고 화살표 또는 선을 그어 사람이 연결되어 있음을 나타낼 경우 참조) 개체를 누른 다음 개체 그래프를 만듭니다.

일부 클래스의 인스턴스 간 링크를 삭제하거나 변경하면 일부 인스턴스가 가비지 수집기에서 제거되는 다른 인스턴스에 참조 (연결)되지 않을 수도 있습니다.

관련 문제