이 고주파수 생산 시스템에서 작업 중입니다. C++ 라이브러리를 호출하는 C#/CLI 계층이 있습니다. 우리가 관찰하고있는 것은 관리 대상이 가라지 수집가의 2 세대로 들어가서 '붙어 다니기'라는 것입니다. 결국 RAM이 다 떨어지면서 C# 응용 프로그램이 중단됩니다. 이러한 관리 객체는 로컬 객체이므로 수명이 매우 짧아야합니다. 또한 그들은 한 번만 참조됩니다. C# 응용 프로그램은 모든 리소스가 강제로 삭제되도록 기본 리소스를 보유한 모든 개체에서 .Dispose()를 호출해야합니다. 우리에게는 꽤 많은 객체가 있으므로 이상적인 것은 아니며 API 관점에서 볼 때 지저분합니다. CLI는 다음과 같습니다 :CLI gen2에서 멈추고 가비지 수집되지 않는 원시 객체
Field::~Field()
{
if(m_pField != NULL)
{
delete m_pField;
m_pField = NULL;
}
System::GC::SuppressFinalize(this);
}
Field::!Field()
{
if(m_pField != NULL)
{
delete m_pField;
}
}
이 짧은 수명의 오브젝트가 수집되지 않고 메모리가 해제 된 것처럼 보이는 이유는 누구나 생각할 수 있습니까?
. 올바른 용어를 사용하면 문제에 대한 해결책을 찾을 때 정보를 찾기가 어려울 수 있습니다. –
임시 개체가 gen # 2로 승격 될 수있는 실용적인 시나리오는 많지 않습니다. 수정 구슬이 파이널 라이저 스레드가 교착 상태가되었다고합니다. 관리되지 않는 디버거를 사용해보십시오. –
소급하여 이러한 일이 1 세대로 진행되었으며 우리가 한 분석이 잘못되었습니다. 스코 츠 추론이 이치에 맞습니다. – UltimateDRT