Maison  >  Article  >  Java  >  Une brève analyse de l'importance du garbage collector GC en Java et de son interaction avec le GC

Une brève analyse de l'importance du garbage collector GC en Java et de son interaction avec le GC

高洛峰
高洛峰original
2017-01-17 15:43:341117parcourir

L'objet est créé en utilisant new, mais il n'y a pas d'opération de suppression correspondante pour recycler la mémoire occupée par l'objet. Lorsque nous avons fini d'utiliser un objet, nous arrêtons simplement de faire référence à l'objet : changeons notre référence pour pointer vers un autre objet ou vers null ou revenons de la méthode pour que les variables locales de la méthode n'existent plus, faisons donc les références à ces variables locales ; les variables ne pointent vers aucun objet. Les objets qui ne sont plus référencés sont appelés garbage collection, et le processus de recherche et de recyclage de ces objets est appelé garbage collection. o

La machine virtuelle Java utilise le garbage collection pour garantir que les objets référencés seront conservés en mémoire. l'espace de stockage occupé par des objets qui ne sont accessibles via aucune référence dans le code en cours d'exécution sera libéré. Il s'agit d'une garantie forte : si un objet peut être atteint en suivant la chaîne de références à partir de la référence racine (c'est-à-dire la référence directement accessible dans le code en cours d'exécution), alors l'objet ne sera pas recyclé.

En bref, lorsque nous ne pouvons accéder à un objet à partir d'un code exécutable, l'espace qu'il occupe peut être récupéré. Notez que nous utilisons le mot « peut » car le fait que l'espace mémoire soit recyclé est déterminé par le garbage collector. Normalement, le garbage collector ne recyclera l'espace mémoire que lorsque plus d'espace mémoire est nécessaire ou pour éviter un débordement de mémoire. Cependant, le programme peut se terminer sans débordement de mémoire, ou même s'il n'est pas proche d'un débordement de mémoire, il n'est donc peut-être pas nécessaire d'effectuer un garbage collection. Dans toutes les méthodes actuellement exécutées, si toutes les variables ne contiennent pas de référence à un objet, et à partir de ces variables, aucune référence à cet objet n'est trouvée dans aucun champ ou élément de tableau le long de la chaîne de référence, alors nous disons simplement que l'objet est « inaccessible ».

La collecte des déchets signifie que nous n'avons jamais à nous soucier des références pendantes. Dans les systèmes où le programmeur a un contrôle direct sur le moment où les objets sont supprimés, le programmeur peut supprimer un objet qui est encore référencé par d'autres objets. Si le programmeur supprime un tel objet, alors les références qui font toujours référence à l'objet supprimé seront supprimées. . deviennent suspendus car ils font référence à l'espace mémoire que le système d'exploitation considère comme allouable (mais qui a en fait été libéré). Le système peut allouer cet espace allouable à de nouveaux objets, de sorte que les références qui pointaient initialement vers cet espace obtiennent en réalité des objets complètement différents de ceux attendus. Dans ce cas, des catastrophes imprévisibles peuvent survenir lorsque le programme utilise des valeurs stockées dans cet espace et les opère comme des objets auxquels elles n'appartiennent pas. Le garbage collection résout pour nous le problème des références en suspens, car tous les objets encore référencés ne seront pas traités comme un garbage collection, de sorte que l'espace qu'ils occupent ne peut pas être libéré. Le garbage collection résout également le problème de la suppression accidentelle du même objet à plusieurs reprises, un problème qui peut conduire à un désastre. Le recyclage des objets poubelles ne nécessite pas notre intervention, mais le recyclage des déchets occupera certaines ressources du système. La création et le recyclage d'un grand nombre d'objets peuvent perturber les applications urgentes. Par conséquent, lors de la conception de tels systèmes, nous devons gérer avec soin le nombre d'objets créés afin de réduire la quantité de déchets à recycler.

Le garbage collection ne garantit pas qu'il y aura toujours de l'espace en mémoire pour créer de nouveaux objets. Par exemple, si nous continuons à créer des objets et les mettons dans une liste, alors lorsqu'il n'y a pas assez d'espace pour créer de nouveaux objets et qu'il n'y a pas d'objets non référencés, aucun nouvel objet ne peut être créé. Si nous laissons la liste ci-dessus contenir des références à des objets qui ne sont plus nécessaires, nous créerions une fuite de mémoire. Le garbage collection résout de nombreux problèmes d’allocation de mémoire (mais pas tous).

Interagir avec le garbage collector

Bien que le langage Java lui-même ne dispose d'aucune méthode explicite pour se débarrasser des objets inactifs, nous pouvons toujours trouver des objets qui ne sont plus utilisés en appelant directement le garbage collector . Certaines méthodes pratiques de la classe Runtime et de la classe système nous permettent d'appeler le garbage collector, de demander l'exécution de tous les finaliseurs à exécuter ou d'afficher l'état actuel de la mémoire :

 .public void gc Q : Cette méthode demande Java La machine virtuelle dépense de l'énergie pour récupérer les objets qui ne sont plus utilisés afin que la mémoire occupée par ces objets puisse être réutilisée.

.public void runFinalization() : Cette méthode demande à la machine virtuelle Java de dépenser de l'énergie pour exécuter les finaliseurs suivants : des objets qui se sont révélés inaccessibles, mais dont les finaliseurs n'ont pas encore été exécutés.

 « public long freememory() : renvoie le nombre estimé d'octets de mémoire système disponible.

 ·public long total Memory () : renvoie le nombre total d'octets de mémoire système.

.public long maxmemoryo : renvoie le nombre maximum d'octets de mémoire système disponible pour la machine virtuelle Java. Si le système d'exploitation n'a pas de limite d'utilisation de la mémoire pour la machine virtuelle Java, Long MAX-VALUE y sera renvoyé. ne sert à rien en Java. Comment définir la mémoire maximale du système Habituellement, la machine virtuelle Java définit cette valeur via la ligne de commande ou d'autres options de configuration.

Pour appeler la méthode ci-dessus, nous devons obtenir une référence à l'objet Runtime actuel via la méthode statique Runtime.getRuntime. La classe système prend en charge les méthodes statiques gc et runFinalization, qui appelleront les méthodes correspondantes sur l'objet Runt-ime actuel ; en d'autres termes, les méthodes System.gc() et Runtime.getRuntime().gc() sont équivalentes.

Lors de l'appel de la méthode Runtime.gc(), le ramasse-miettes peut ne pas être en mesure de libérer de la mémoire supplémentaire, car il se peut qu'il n'y ait pas de déchets à collecter et tous les ramasse-miettes ne peuvent pas trouver de mémoire disponible à la demande. Recyclez les objets. Donc appeler le ramasse-miettes peut n’avoir aucun effet. Cependant, il est toujours conseillé d'appeler la méthode Runtime.gc() avant de créer un grand nombre d'objets, en particulier dans les applications à temps critique où la surcharge du garbage collection peut l'affecter. Il y a deux avantages potentiels à cela : le premier est que nous pouvons obtenir autant de mémoire que possible avant d'exécuter l'application, et le second est que nous pouvons réduire la probabilité que le ramasse-miettes s'exécute pendant l'exécution de la tâche. La méthode suivante libère activement tout l'espace qui peut être libéré au moment de l'exécution :

public static vo记ful1GC(){
 
Runtime rt=Runtime.getRuntime();
 
long isFree=rt.freeMemory ();
 
long wasFree;
 
do{
 
wasFree=isFree;
 
rt.runFinalization ();
 
rt.gc();
 
isFree二rt.freeMemory();
 
}while (isFree>wasFree);
 
}

Cette méthode est en boucle continue en appelant continuellement les méthodes runFinalization et gc, la valeur de freememory continue d'augmenter. Lorsque la quantité de mémoire libre n'augmente plus, la boucle de cette méthode se termine.

Nous n'avons généralement pas besoin d'appeler la méthode runFinalization car la méthode finalize est appelée de manière asynchrone par le garbage collector. Dans certains cas, par exemple lorsque les ressources d'un élément pouvant être récupérées par la méthode finalize sont épuisées, il est utile de forcer autant de finalisation que possible en appelant run-Finalization. Mais n'oubliez pas qu'il n'y a aucune garantie qu'un objet en attente de finalisation utilise cette ressource, donc runFinalization peut n'avoir aucun effet.

L'approche fullGc est trop agressive pour la plupart des applications. Dans le cas particulier où le garbage collection doit être forcé, un seul appel à la méthode system.gc collecte la plupart, sinon la totalité, des garbage disponibles, donc des appels répétés réduiront le taux de sortie du garbage collection, et dans de nombreux systèmes. ces appels répétés sont improductifs.

Pour plus d'articles sur la signification du garbage collector GC en Java et son interaction avec le GC, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn