por exemplo, eu tenho um classe:
public class Cliente {
///bla bla bla
}
Como saber em um determinado momento quantas instancias da classe Cliente estao na memoria?
Obrigado.
por exemplo, eu tenho um classe:
public class Cliente {
///bla bla bla
}
Como saber em um determinado momento quantas instancias da classe Cliente estao na memoria?
Obrigado.
cria uma variavel statica que soma 1 a cada vez que o construtor for chamado e sobrescreve o metodo finalize para subtrair 1 dessa variavel
Nao posso, nao posso alterar a classe. Tem que ter outro jeito…
Eu dei esse exemplo de Cliente, mas na verdade é um projeto que trabalha sobre outro sistema o qual não possuimos os fontes, embora tenhamos como dar import em todas as classes desse sistema, nao podemos altera-las, por isso preciso de outro jeito.
você pode extender essa classe e adicionar a variavel estatica que foi comentada no post acima!
nao
Cria um Classe Factory para obter a instância da classe e colocar o método para contar as instâncias nela.
Na boa… as vezes vocês complicam muito para coisa pouca.
public class ClasseContada {
private static int instancias;
public ClasseContada() {
instancias++;
}
public static int getInstancias() {
return instancias;
}
protected void finalize() throws Throwable {
instancias--;
super.finalize();
}
}
Na boa... as vezes vocês complicam muito para coisa pouca.public class ClasseContada { private static int instancias; public ClasseContada() { instancias++; } public static int getInstancias() { return instancias; } protected void finalize() throws Throwable { instancias--; super.finalize(); } }
Amigos, eu nao posso alterar a classe conforme dito acima. Essa solucao sua ai funcionaria se eu pudesse.
Também nao dá, pois geralmente não é meu fonte que instancia as classes, elas podem vir pela rede (via RMI) pelo hibernate (do DB) ou ainda criadas por Threads internas desse sistema, embora o sistema esteja rodando na mesma VM, eu nao tenho como garantir quando o sistema vai instanciar uma nova classe.
Eu achei esse metodo aqui na classe Window, mas se eu altero ele para a minha classe sempre retorna 0:
synchronized (FormGerenciarClientes.class) {
FormGerenciarClientes realCopy[];
Vector<WeakReference<FormGerenciarClientes>> windowList =
(Vector<WeakReference<FormGerenciarClientes>>) appContext.get(FormGerenciarClientes.class);
if (windowList != null) {
int fullSize = windowList.size();
int realSize = 0;
FormGerenciarClientes fullCopy[] = new FormGerenciarClientes[fullSize];
for (int i = 0; i < fullSize; i++) {
FormGerenciarClientes w = windowList.get(i).get();
if (w != null) {
fullCopy[realSize++] = w;
}
}
if (fullSize != realSize) {
realCopy = Arrays.copyOf(fullCopy, realSize);
} else {
realCopy = fullCopy;
}
} else {
realCopy = new FormGerenciarClientes[0];
}
System.out.println(realCopy.length);
}
Se ao inves de colocar FormGerenciarClientes colocar Window funciona perfeito. Mas qualquer outra classe do sistema sempre imprime 0!
Ahh tah…
Bem, não sei te dizer um nome, mas ferramentas de depuração podem te dizer quantas instancias das suas classes, ou outras, estão na memoria.
Existe uma ferramenta chamada Visual VM ela já vem junto com o netbeans mas você pode baixa-la à parte se der uma googlada.
Mas que fique claro que essa informação não estará dentro do seu aplicativo.