Bonjour
Je cherche un moyen qui permet de récupérer tous les object instanciés d'une classe.
Est ce que ça existe? j'ai pensé à ce que ça soit une méthode dans la classe Class, mais je n'ai rien trouvé.
Merci d'avance.
Version imprimable
Bonjour
Je cherche un moyen qui permet de récupérer tous les object instanciés d'une classe.
Est ce que ça existe? j'ai pensé à ce que ça soit une méthode dans la classe Class, mais je n'ai rien trouvé.
Merci d'avance.
Salut,
Pas directement en runtime, non. Il y a des moyens (par exemple en mode debug, ou profilage). Mais la question est pourquoi tu as ce besoin ?
Si tu as besoin de ça dans le fonctionnement normal de ton programme, tu peux toujours t'arranger pour stocker les références des instances de ta classe dans un conteneur.
Le type du conteneur dépend des spécificités de la classe, et de certaines conditions d'utilisation.
Une WeakHashMap conservera que les instances qui n'ont pas été garbagées, ce qui permet de n'avoir un impact que sur la construction pour gérer le conteneur. Malheureusement, tu pourras y trouver des instances qui ne sont plus référencées, ou alors il faut imposer au code qui utilise ces instances en appelant une méthode release comme pour un pool.
Attention, avec la WeakHashMap avec les classes mutables : il faudra utiliser comme clef un indentifiant unique (valeur et référence) non mutable (avec un AtomicInteger pour fabrique par exemple et new Integer(IDFACTORY.getAndIncrement())) à utiliser comme clef.
On peut utiliser un simple Set si on a une méthode release (aussi faut-il qu'elle soit systématiquement appelée lorsque c'est nécessaire) et qu'aucune instance ne peut être égale à une autre (aux termes de hashCode() et equals()), sinon une List.
En tout cas, c'est bien complexe et difficile de rendre sûr, et je ne vois pas de raison fonctionnellle d'avoir à le faire (les seules fois où j'en ai eu besoin, c'est en debug ou en profiling).
Pas grand chose d'autre à ajouter par rapport à ce joel.drigo.
Si tu es seulement intéressé par l’empreinte mémoire, tu peux utiliser JVisualVM (fournit avec le jdk). Il te permet d'avoir le nombre d'instance d'une classe ou d'un type primitif et le pourcentage que cela représente par rapport au total.
Cela est assez pratique pour avoir une idée d'où se trouve la plus grosse consommation mémoire rapidement.
Cordialement,
Patrick Kolodziejczyk.
ou Java Mission Control...