Question

Je suis un programmeur C ++ en train d'essayer de travailler sur Java. Travailler sur C ++ j'ai une habitude de garder la trace des allocations de mémoire dynamique et en utilisant différentes techniques comme RAII pour éviter la fuite de mémoire. Java comme nous le savons fournit un Garbage Collector (GC) pour prendre soin de mémoire leaks.So en programmant en Java doit-on laisser aller tous les soucis sains de mémoire tas et laisser pour GC de prendre soin des fuites de mémoire ou si l'un une approche similaire à celle en langages de programmation sans GC, essayez de prendre soin de la mémoire que vous allouez et laisser GC prendre soin de ceux que vous pourriez manquer. Quelle devrait être l'approche? Quels sont les inconvénients des deux?

Était-ce utile?

La solution

Je ne sais pas ce que vous entendez en essayant de prendre soin de la mémoire que vous allouez en présence d'un GC, mais je vais essayer de la lecture de l'esprit.

En fait, vous ne devriez pas « inquiétude » au sujet de votre mémoire recueillies. Si vous ne faites pas référence plus des objets, ils seront ramassés. les fuites de mémoire logiques sont encore possibles si vous créez une situation où les objets sont référencés pour le reste de votre programme (par exemple: enregistrer les auditeurs et ne les désenregistrer, par exemple: la mise en œuvre d'un vecteur semblable collection qui ne articles mis pas null lorsque la suppression d'éléments hors l'extrémité).

Cependant, si vous avez une solide expérience RAII, vous serez déçu d'apprendre qu'il n'y a pas d'équivalent en Java. Le GC est un outil de première classe pour faire face à la mémoire, mais il n'y a pas garanti quand (ou même si) finaliseurs sont appelés. Cela signifie que le traitement de première classe appliquée à la mémoire est pas appliqué à toute autre ressource, tels que:. Les fenêtres, les connexions de base de données, sockets, fichiers, primitives de synchronisation, etc

Autres conseils

Avec Java et .net (et je pense, la plupart des autres langues de GC'ed), vous n'avez pas besoin de vous soucier de la mémoire tas du tout. Ce que vous faire à vous en préoccuper, est des ressources indigènes comme les handles de fichiers, sockets, primitives GUI comme les polices et autres. Ceux ont généralement besoin d'être « disposé », ce qui libère les ressources indigènes. (Ils se disposent souvent sur la finalisation de toute façon, mais il est hasardeux de se replier un peu sur ce point. Choses Éliminez-vous.)

Avec un GC, vous devez:

  • toujours prendre soin de libérer correctement les ressources non-mémoire comme descripteurs de fichiers et les connexions DB.
  • assurez-vous que vous ne gardez pas les références aux objets que vous n'avez plus besoin (comme les garder dans des collections). Parce que si vous faites cela, vous avez une fuite de mémoire.

En dehors de cela, vous ne peuvent pas vraiment « prendre soin de la mémoire que vous allouez », et d'essayer de le faire serait une perte de temps.

Techniquement, vous n'avez pas besoin de vous soucier de nettoyer après les allocations de mémoire puisque tous les objets sont correctement référence comptés et le GC se chargera de tout. Dans la pratique, un GC hyperactive aura un impact négatif sur les performances. Ainsi, alors que Java ne dispose pas d'un opérateur delete, vous ferez bien des objets de réutilisation, autant que possible.

Aussi Java ne pas Destructeurs puisque les objets de testament jusqu'à ce que le GC obtient les ,. Java a donc la construction de finally que vous devez utiliser pour faire en sorte que toutes les ressources liées à la non-mémoire (sockets fichiers, etc.) sont fermés lorsque vous avez terminé avec eux. Ne comptez pas sur la méthode finalise pour le faire pour vous.

En Java le GC prend en charge l'allocation de mémoire et libérer de la mémoire inutilisée. Cela ne signifie pas que vous pouvez ignorer la question alltogether.

Les objets Java GC Libère qui ont ne sont pas référencées de la racine. Cela signifie que Java peut encore avoir des fuites de mémoire si vous n'êtes pas prudent de supprimer les références de contextes mondiaux comme caches dans HashMaps mondiales, etc.

Si un groupe d'objets qui référence eachother ne sont pas référencés à partir de la racine, le Java GC les libérer. C'est à dire. il ne fonctionne pas avec un nombre de référence, de sorte que vous n'avez pas besoin de null toutes les références de l'objet (bien que certains styles de codage ne préfèrent les références de compensation comme sonn car ils ne sont plus nécessaires.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top