Pouvez utiliser un trop grand nombre de variables statiques provoquer une fuite de mémoire en Java?
Si ma demande a trop de variables statiques ou des méthodes, alors que par définition ils seront stockés en tas. S'il vous plaît corrigez-moi si je me trompe
1) ces variables sur le tas jusqu'à ce que l'application est fermée?
2) Seront-ils disponibles pour les GC à tout moment? Si non je peux dire c'est une fuite de mémoire?
Vous devez vous connecter pour publier un commentaire.
Méthodes statiques sont juste des méthodes, elles ne sont pas stockées sur le tas, ils n'ont tout simplement pas l'habitude d'utiliser un "ce" paramètre.
Variables statiques servent de "racines" de la GC. En conséquence, sauf si vous explicitement définie sur null, ils vivront aussi longtemps que le programme de vie, et donc, tout est accessible à partir d'eux.
Une situation est considérée que comme une fuite de mémoire si vous avez l'intention pour que la mémoire de devenir libre et il ne deviendra pas gratuit. Si vous avez l'intention de votre variable statique pour contenir une référence à un objet, une partie du temps, et que vous oubliez de le mettre à null lorsque vous avez terminé avec cet objet, vous auriez probablement jusqu'à la fin avec une fuite. Toutefois, si vous le mettez dans une variable statique et l'intention qu'il sera là tant que le programme est en cours d'exécution, alors il n'est certainement pas une fuite, il est plus probable d'un "permanent singleton". Si l'objet reçu récupérée alors que vous vouliez qu'il existe encore, qui aurait été très mauvais.
Quant à votre question sur le tas: Tous les objets en Java exister, soit sur le tas ou sur la pile. Les objets sont créés sur le tas avec l'opérateur new. Une référence est ensuite attaché à eux. Si la référence est ou devient nulle ou est hors de portée (par exemple, la fin du bloc), le GC se rend compte qu'il n'y a aucun moyen d'atteindre l'objet et la reprend-il. Si votre référence est dans une variable statique, il ne tombe jamais hors de portée, mais vous pouvez toujours mettre à null ou à un autre objet.
Si vous avez une table de hachage statique et que vous ajoutez des données à... les données ne disparaissent jamais et vous avez une fuite dans le cas où vous n'avez pas besoin de données plus. Si vous avez besoin des données, il n'est pas une fuite, mais une énorme pile de mémoire traîner.
Objets, directement ou indirectement, référencé par la statique restera sur le tas jusqu'à ce que la classe loader peuvent être collectées. Il y a des cas (ThreadLocal, par exemple) où d'autres objets indirectement référence à la classe de chargement en le faisant rester non perçus.
Si vous avez une Liste statique, dire, et d'ajouter des références à celui-ci de façon dynamique, alors vous pouvez très facilement se retrouver avec une "durée de vie des objets les problèmes de conflit". Éviter mutable statique pour de nombreuses raisons.
Aussi longtemps que vous pouvez faire référence à ces variables à partir de quelque part dans le code, il ne peut pas par GCed ce qui signifie qu'ils seront là jusqu'à la fin de l'application.
Pouvez-vous appeler cela une fuite de mémoire, je n'appellerais pas ça une fuite de mémoire, généralement une fuite de mémoire est une mémoire qui vous normalement s'attendre à récupérer, mais vous n'avez jamais le faire, ou vous ne récupérer qu'une partie. Aussi des fuites de mémoire, généralement de s'aggraver dans le temps (par exemple: chaque fois que vous appelez une méthode plus la mémoire est "fuite") mais dans ce cas, l'utilisation de la mémoire pour les variables est (un peu) statique.
Il ne sera pas provoquer une fuite de mémoire dans le sens classique C... Par exemple
Dans ce cas, un appel à makeFoo() ne se traduira pas par une fuite de mémoire, comme la première instance peut être nettoyée.