Objeto de acompanhamento na API de criação de perfil
Lixo coleção recupera a memória ocupada por objetos inativos e pode compactar o espaço livre. sistema autônomo resultado, são movidos sistema autônomo objetos ao vivo na pilha. Este tópico explica como a movimentação do objeto afeta ObjectID valores e como esses valores são controlados pela API de criação de perfil durante a compactação e a coleta de lixo não-compactação.
Movimentação de objeto
Ao mover os objetos, ObjectID valores que foram atribuídos por anterior notificações de alterar. O estado interno do próprio objeto não é alterado, exceto para suas referências a outros objetos. Somente o local do objeto na memória (e, portanto, sua ObjectID) as alterações. The ICorProfilerCallback::MovedReferences notificação permite que um criador de perfil de atualizar suas tabelas internas que rastreiam informações por ObjectID. The MovedReferences nome do método é um pouco enganosa, porque é emitido, mesmo para objetos que não foram movidos.
O número de objetos no heap pode numerar milhares ou milhões. Seriam impraticável para controlar o movimento de um número grande de objetos, fornecendo um antes e após a ID de cada objeto. Portanto, o coletor de lixo tende a mover objetos vivos contíguos em blocos, para que elas permanecem contíguas em seus novos locais na heap. The MovedReferences relatórios de notificação do antes e depois ObjectIDs desses blocos contíguos de objetos.
Suponha que um existenteObjectID valor)oldObjectID) se encontra no seguinte intervalo:
oldObjectIDRangeStart[i] <= oldObjectID < oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]
Nesse caso, o offset do início do intervalo para o início do objeto é o seguinte:
oldObjectID - oldObjectRangeStart[i]
Para qualquer valor de i que está no seguinte intervalo:
0 <= i < cMovedObjectIDRanges
Você pode calcular a nova ObjectID sistema autônomo a seguir:
newObjectID = newObjectIDRangeStart[i] + (oldObjectID – oldObjectIDRangeStart[i])
Todos os retornos de chamada essas são feitos enquanto o Common linguagem tempo de execução (CLR) está suspenso. Portanto, nenhum dos valores Id_objeto pode alterar até os currículos de tempo de execução e outro lixo coleção ocorre.
A ilustração a seguir mostra os dez objetos antes de lixo coleção. Os endereços de início (equivalente a ObjectIDs) são 08, 09, 10, 12, 13, 15, 16, 17, 18 e 19. Os objetos com ObjectIDs 09 13 e 19 estão inativos e seu espaço será ser recuperado durante lixo coleção.
objeto movimentação durante a coleta de lixo
Parte inferior da ilustração mostra os objetos depois de lixo coleção. O espaço foi ocupado por objetos mortos tem sido recuperado para conter objetos ao vivo. Os objetos ao vivo na heap foram movidos para os novos locais são mostrados. sistema autônomo resultado, sistema autônomo ObjectIDsistema autônomo será alterado. A tabela a seguir mostra o ObjectIDs antes e depois lixo coleção.
Objeto |
[] oldObjectIDRangeStart |
[] newObjectIDRangeStart |
---|---|---|
0 |
08 |
07 |
1 |
09 |
|
2 |
10 |
08 |
3 |
12 |
10 |
4 |
13 |
|
5 |
15 |
11 |
6 |
16 |
12 |
7 |
17 |
13 |
8 |
18 |
14 |
9 |
19 |
A tabela a seguir compacta as informações, especificando a partida posições e tamanhos de blocos contíguos. Esta tabela mostra exatamente como a MovedReferences método reporta as informações.
Blocos |
[] oldObjectIDRangeStart |
[] newObjectIDRangeStart |
[] cObjectIDRangeLength |
---|---|---|---|
0 |
08 |
07 |
1 |
1 |
10 |
08 |
2 |
2 |
15 |
11 |
4 |
Detectar todos os objetos excluídos
The MovedReferences método relata todos os objetos que sobrevivem a um compactação lixo coleção, independentemente de eles movidos. Qualquer objeto não relatado por MovedReferences não sobreviver. No entanto, nem todas as coletas de lixo estiver compactando. Nas versões do .NET estrutura 1.0 e 1.1, o criador de perfil não pôde detectar objetos sobreviveram um lixo sem compactação coleção (um lixo coleção no qual não há objetos são movidos em todos os). O .NET estrutura versão 2.0 fornece melhor suporte para esse cenário através dos seguintes métodos novos:
O criador de perfil pode chamar o ICorcriador de perfilInfo2::GetGenerationBoundsmétodo para obter os limites de coleta de lixo heap segmentos. The rangeLength campo resultante COR_PRF_GC_GENERATION_RANGE estrutura pode ser usada para determinar a extensão de objetos ao vivo em uma geração compactada.
The ICorProfilerCallback2::GarbagecoleçãoStartedretorno de chamada indica que as gerações estão sendo coletadas pelo lixo corrente coleção. Todos os objetos que estão em uma geração não está sendo coletada sobreviverão o lixo coleção.
The ICorProfilerCallback2::SurvivingReferencesretorno de chamada indica quais objetos sobreviveram um lixo sem compactação coleção.
Observe que um único lixo coleção podem ser a compactação para uma geração e não-compactação para a geração de outra. Ou seja, qualquer dada geração receberá qualquer um dos SurvivingReferences ou MovedReferences retornos de chamada para um determinado lixo coleção, mas não ambos.
Comentários
Após um lixo coleção, um aplicativo é interrompido até que o tempo de execução termine passar informações sobre a pilha para o criador de perfil de código. Você pode usar o ICorProfilerInfo::GetClassFromObject método para obter o ClassID classe do objeto. Você pode usar o ICorProfilerInfo::GetClassIDInfo or ICorProfilerInfo2::GetClassIDInfo2método para obter informações de metadados sobre a classe.
Nas versões do .NET estrutura 1.0 e 1.1, quando uma operação de coleta de lixo for concluída, todos os objetos sobreviventes deve ser uma referência raiz, para ter um pai é uma referência raiz ou existir em uma geração não foi coletada. Às vezes, é possível ter objetos que não pertencem a qualquer uma dessas categorias. Esses objetos são alocados tanto internamente pelo tempo de execução ou são referências fracas para representantes. No .NET estrutura 1.0 e 1.1, a API de criação de perfil não permite ao usuário identificar esses objetos.
No .NET estrutura versão 2.0, três métodos foram adicionados ao ajudar o criador de perfil a esclarecer exatamente quais gerações são coletadas e quando e para identificar quais objetos estão raízes. Esses métodos ajudam o criador de perfil determinar por que os objetos permanecem após uma coleção:
The ICorProfilerCallback2::RootReferences2 método permite que o criador de perfil identificar objetos que são mantidos por meio de identificadores especiais. A geração circunda as informações fornecidas pelo ICorProfilerInfo2::GetGenerationBounds método combinado com as informações coletadas geração fornecidas pelo ICorProfilerCallback2::GarbageCollectionStarted método permitem que o criador de perfil identificar objetos existentes em gerações que não foram coletadas.
Referência
Método ICorProfilerCallback::MovedReferences
Método ICorProfilerCallback2::SurvivingReferences
Método ICorProfilerInfo2::GetGenerationBounds