개체에 대해 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.
"삭제 된 객체에 대한 강력한 참조를 추가 한 후"모두 강력한 참조에 의존하여 저장/관리 방법을 보여줍니다. –
일부 코드 샘플로 업데이트되었습니다. –