2012-05-06 4 views
1

개체에 대해 WeakReference가 포함 된 컬렉션이 있습니다. 개체는 런타임 중에 동적으로로드되며 임의로 GC로 수집 할 수 있습니다.참조가 사용되지 않는 경우 객체에 대한 참조를 보유하면 메모리에 유지됩니까?

때때로 영구적으로 개체를 삭제해야합니다.이 작업은 비동기 DB 명령으로 수행됩니다. 의미 - 개체를 GC 할 수 있고 DB에서 다시로드 할 수있는 지속성 데이터베이스에서 삭제 명령과 삭제를 실제로 커밋하는 사이에 시간 간격이 있습니다.

나를 해결할 수있는 가장 쉬운 방법은 각 개체 (이미 하나)에 '삭제됨'플래그가 있고 삭제 작업을 수행 할 때 삭제 된 개체에 대한 강력한 참조를 DB 명령 개체에 추가하는 것입니다 , 작업이 완료되면 강력한 참조가 손실되고 객체를 영원히 해제 할 수 있습니다.

질문은 GC가 미리 읽기로 내 개체를 수집 할 수 있습니까? 이 시나리오에 적용됩니까? DB 명령이 대기열에서 제외되고 처리 될 때까지 해당 개체가 수집되지 않을 것이라고 보장합니까? 여기

약간 낮은 수준의 상세이다

Dictionary<Int64, WeakReference> mItems; 
struct IOCommand 
{ 
    public CommandDetails command; 
    public object[] strongReferences; 
} 
Queue<IOCommand> mIOQueue; 
void queueCommand(CommandDetails command, object relatedObject) 
{...} 

는 명령 대기열 때 I가 처리 될 때까지 큐에 유지 강한 참조로 관련 오브젝트를 전달하지만, 대상으로하지 않은 것을 알 수있다 질문을 사용하면 멀리 떨어져서 최적화 할 수 있습니까?

Amit.

+0

"삭제 된 객체에 대한 강력한 참조를 추가 한 후"모두 강력한 참조에 의존하여 저장/관리 방법을 보여줍니다. –

+0

일부 코드 샘플로 업데이트되었습니다. –

답변

3

코드에 개체에 대한 (비 weak) 참조가 있으면 해당 개체는 수집되지 않습니다.

당신은 안전해야합니다. (미래의) Db Command가 참조를 사용할 것이라는 사실은 그것이 여전히 존재할 것이라는 것을 확실히합니다.

이 경우 WeakReference에 의존하지 말고, 강력한 참조에는 적절한 수명이 있어야합니다.


하지만 개체를 ​​사용하지 않는 한 문제는 그들이 멀리 최적화 할 수있다

...

번호 당신이 그 (것)들을 만들 것이다 저장하는 방식은 확실히 그들은 명령만큼 존재 대기열에 저장되며, 물론 대기열에 도달 할 수있는 한.

그러나

+0

http://stackoverflow.com/questions/8300653/what-is-the-life-expectency-of-structs-when-returned-from-method-and-passed-as-p를 참조하십시오. 만약 내가 스택에 대한 강력한 참조를 가지고 있다면 CLR이 참조가 사용될 것인지를 확인할 수 있다는 것을 안다. * 그렇지 않다면, 그것을 무시하고 객체를 GC 할 수있다. 스택에없는 참조. –

+0

귀하의 질문은 해당 참조의 유효 기간을 중심으로하므로 코드에 대한 아이디어를 추가하십시오. 지금은 대답 할 수 없습니다. –

+0

개체는 삭제되지 않고 DB에서 다시로드되지 않도록하기 위해 메모리에 삭제 된 상태를 나타내는 '제거됨'플래그가 포함되어 있습니다. –

1

GC가에 대한 참조와 함께 아무것도 제거하지 안 ... 그들은 정말 사용하지 않는 경우도 문제가 안됩니다. WeakReference는 특별히 참조하는 항목을 수집하도록 선택한 경우를 제외하고는 예외입니다. DB 명령에 삭제할 개체에 대한 참조가 있으면 잘 될 것입니다.

+0

아니요. 도달 할 수없는 * 이미 토스트 일 수있는 경우 원하는대로 개체에 대한 많은 (강력한) 참조를 가질 수 있습니다. 그리고 도달 할 수있는 유일한 참조가 미래에 사용되지 않는다면 물체는 도달 할 수 없습니다. – delnan

+0

감사합니다 @delnan, 더 나은 설명을 위해 몇 가지 코드 샘플을 추가했습니다. –

관련 문제