Como posso acessar objects de heap Java sem uma referência?

Eu gostaria de obter uma referência a todos os objects no heap Java, mesmo que eu não tenha imediatamente uma referência a esses objects no meu segmento ativo. Eu não preciso de objects não referenciados (aqueles “enfileirados” para garbage collection), mas gostaria de obter qualquer coisa que ainda esteja em uso.

O objective é serializar e armazenar todos os objects para implementar a persistência do estado de execução de um homem pobre. Eu percebo que o buraco do coelho vai fundo quando se trata de diferentes tipos de estado transitório, mas simplesmente objects persistentes e definições de classs carregadas seriam úteis para mim.

Existe uma maneira de acessar o heap para que isso aconteça? Eu estou negligenciando uma abordagem mais direta?

Eu olharia para o pacote do instrumento . Instrua as classs de seu interesse para que o ctor registre a instância criada. Você pode fazer isso através do AspectJ caso não queira usar o java.lang.instrument ou se os objects forem criados por meio de algo que você pode controlar (um contêiner ou fábricas da IoC), então você pode fazer algo muito menos mágico.

Se você quiser fazer um dump de heap programaticamente, não encontrará APIs adequadas no namespace java. * Ou javax. *. No entanto, o tempo de execução da Sun é fornecido com o HotSpotDiagnosticMXBean, que permitirá que você faça um despejo de pilha gravando o conteúdo do heap em um arquivo especificado no disco.

Eu sugiro que você faça um dump de heap e, em seguida, inspecione-o usando o Eclipse Memory Analyzer .

As exibições disponíveis permitem detalhar o nível da instância e exibir as propriedades do object. Você pode até mesmo consultar objects usando linguagem de consulta OQL e SQL para objects.

O painel esquerdo na captura de canvas abaixo demonstra a inspeção dos valores dos campos.

screenshot http://img181.imageshack.us/img181/4013/dominatortreegrouped.png