Estou com um problema que não consigo resolver.
Gostaria de saber se existe algum método enbutido no Java para descobrir quantas referências em execução uma determinada instância tem.
Por exemplo: eu tenho uma instância de um objeto chamado Produto que está espalhado por várias pilhas. Até então eu não tenho como descobrir quantas destas pilhas estão com uma referência desta instância. Se houvesse como eu ter esta informação, eu poderia finalizar a referência principal quanto o número de referências fosse igual a um para conseguir liberar memória. Se o número de referências for maior que um, então a mantenho, pois se novas pilhas buscarem um Produto com o mesmo código então ele pega o mesmo. Eu guardo a referência destas instâncias pois este objeto tem informações que são recalculadas a cada dez minutos, se eu criar uma nova instância para cada produto então esta função perde a funcionalidade, pois cada vez que instanciar ele vai recalcular tudo denovo mesmo não estando dentro do prazo de dez minutos. E o recalculo é um pouco demorado.
É só você manter uma variável contadora declarada como static na sua classe. Assim, você pode incrementar essa variável no seu construtor. Isso serve como um bom controle do número de objetos desta classe instanciados. Com um getter também static fica fácil
public class BlaBla {
private static int instancias;
public BlaBla() {
++instancias;
}
public static int getInstancias() { return instancias; }
}
Usando isso tudo
public class Main {
public static void main(String[] args) {
BlaBla obj = null;
for(int i = 0; i < 10; ++i) {
obj = new BlaBla();
System.out.println("Instancias de BlaBla => " + BlaBla.getInstancias()); }
}
}
Sim, mas o que eu quero saber é quantas referências em aberto a instância tem no momento. Desta forma que você passou, eu não consigo saber se as referências perderam ligação com a instância na memória. Assim só dá pra saber quantas vezes eu instanciei determinado objeto, mas não sei se as referências estão em execução.
O negócio é complicado mesmo, mas para eu não ter o trabalho de reestruturar todo meu código, esta tática que eu procuro, se existir, vai me ajudar muito sem ter trabalho adicional.
BlaBla bla = new BlaBla ();
BlaBla bla2 = bla;
//TENHO DUAS INSTANCIA E APENAS UM OBJETO;
no seu caso você gostaria de contar as variaveis e naum os objetos, é isso ??[/quote]
Tá louco? Aqui você tem SOMENTE UMA INSTÂNCIA. Você tem duas referências distintas (bla e bla2, cada uma guardando uma referência distinta), mas existe somente uma instância alocada em memória.
Estou com um problema que não consigo resolver.
Gostaria de saber se existe algum método enbutido no Java para descobrir quantas referências em execução uma determinada instância tem.
Por exemplo: eu tenho uma instância de um objeto chamado Produto que está espalhado por várias pilhas. Até então eu não tenho como descobrir quantas destas pilhas estão com uma referência desta instância. Se houvesse como eu ter esta informação, eu poderia finalizar a referência principal quanto o número de referências fosse igual a um para conseguir liberar memória. Se o número de referências for maior que um, então a mantenho, pois se novas pilhas buscarem um Produto com o mesmo código então ele pega o mesmo. [/quote]
Não faz muito sentido vc matar a referencia se o numero de referencias for igual a 1 já que isso significa que pelo menos uma pilha tem o objeto. Por outro lado, se vc não criou copias a intancia será a mesma em todas as pilhas, logo seu contador sempre será 1.
[quote=leonamp]Sim, mas o que eu quero saber é quantas referências em aberto a instância tem no momento. Desta forma que você passou, eu não consigo saber se as referências perderam ligação com a instância na memória. Assim só dá pra saber quantas vezes eu instanciei determinado objeto, mas não sei se as referências estão em execução.
O negócio é complicado mesmo, mas para eu não ter o trabalho de reestruturar todo meu código, esta tática que eu procuro, se existir, vai me ajudar muito sem ter trabalho adicional.[/quote]
Agora entendi o que você precisa… É, ai é complicado mesmo… Deve haver alguma maneira, mesmo porque o GC deve usar algo parecido…
Nesse caso vc queria que bla2 também contasse como um novo objeto? Nesse caso não entendi… porque na verdade bla2 e bla representam a mesma coisa (apontam para o mesmo espaço de memória)…
Se o que vc quer é replicar o objeto Produto para um OUTRO objeto, vc deve usar
Blabla bla2 = bla.clone();
Isso, em casos gerais, te dará um outro objeto com as mesmas propriedades mas que ocupa outro espaço de memória, e também irá incrementar aquela variável estática
// Agora tenho 6 referências apontanto para 3 instâncias
produto7 = produto1;
// A instância da primeira vez que eu instanciei o objeto Produto tem as referências: produto1, produto4 e produto7. Portanto 3 referências ativas.
produto7 = null;
// Agora esta mesma instância tem as seguintes referências: produto1 e produto4. Portanto 2 referências ativas.
// É isso que eu quero saber. quantas referências estão apontanto para determinada instância na memória.
Desculpem minha forma de me expressar, mas o que eu chamo de referência vocês chamam de variável.
Quando eu aprendi Java, me ensinaram que variável se aplica somente a primitivos, e instâncias tem referências.
Mas é só interpretar minha pergunta como se tratasse de variaveis.
[quote=leonamp]Desculpem minha forma de me expressar, mas o que eu chamo de referência vocês chamam de variável.
Quando eu aprendi Java, me ensinaram que variável se aplica somente a primitivos, e instâncias tem referências.
Mas é só interpretar minha pergunta como se tratasse de variaveis.[/quote]
É mais ou menos isso que você falou mesmo… Essa idéia de chamar tudo de variável vem de linguagens não OO e o pessoal acaba usando no Java também. Mas no caso de objetos concordo com você que o certo é referência mesmo.
Essa tá difícil mesmo. Talvez nem tenha como fazer isto. Mas se alguém descobrir me avisem por favor, pois já vasculhei na internet e não achei nada exatamente como eu preciso. Achei algumas coisa que tem haver, mas não é exatamente igual, por isso estou com esperança de conseguir. Acho que a chave do problema é conseguir ter acesso as informações que o GC tem. Mas não sei se a Sun desenvolveu alguma ferramenta que acessa estas informações direto do código do aplicativo. Talvez eu queira ir longe demais…