2008-11-18 8 views
5

Quand j'appelle une méthode statique comme:Java: `Méthodes static`

Something.action(); 

Depuis une instance ne se crée pas combien de temps la classe de la méthode statique lieu en mémoire?

Si j'appelle la même méthode, la classe sera-t-elle rechargée pour chaque appel puisqu'il n'existe aucune instance?

Et seules les méthodes statiques individuelles sont-elles chargées lors de l'appel ou toutes les méthodes et méthodes statiques d'une classe sont-elles chargées en mémoire même si une seule méthode statique peut être utilisée?

Répondre

11

Sauf si vous avez configuré la récupération de place de l'espace persistant, la classe reste en mémoire jusqu'à ce que vm soit fermé. La classe complète est chargée avec toutes les méthodes statiques.

+0

Ceci n'est pas strictement vrai, bien qu'il s'agisse d'un modèle mental raisonnable de chargement de classe. Certaines machines virtuelles déchargeront dynamiquement les classes inutilisées afin de réduire la taille de la mémoire résidente; Cependant, une telle optimisation ne sera appliquée qu'avec des processus très longs et uniquement sur les machines virtuelles qui l'implémentent. –

4

La classe reste en mémoire jusqu'à ce que le chargeur de classe qui a chargé cette classe reste en mémoire. Donc, si la classe est chargée à partir du chargeur de classes système, la classe ne sera jamais déchargée autant que je sache.

Si vous souhaitez décharger une classe, vous devez:

  1. charge la classe et toutes les classes qui font référence à cette classe en utilisant un chargeur de classe personnalisée
  2. Une fois que vous avez terminé avec cette classe, la libération toutes les références à la classe - c'est-à-dire assurez-vous qu'il n'y a aucune instance d'objet autour de cette classe
  3. Déchargez la classe et toutes les classes qui s'y réfèrent en libérant l'instance de chargeur de classes personnalisée qui a chargé ces classes.
1

Le Quelque chose devrait être chargé lorsque la classe de l'appelant sera chargée. Et il reste là jusqu'à la sortie de la VM comme l'a dit krosenvold.

2

Dans certaines configurations, la classe est même chargée avant de passer l'appel. Nous avons utilisé BES (Borland Enterprise Server) et nous avons eu des problèmes avec nos serveurs de production Solaris où toutes les classes référencées étaient chargées récursivement au démarrage de notre application. Cela signifie que lorsque la classe principale de notre application a été chargée, le serveur d'applications a chargé toute la classe référencée dans la section d'importation de cette classe ... récursivement. En même temps, à moins que vous ne travailliez dans un environnement de contrainte de mémoire ou que vous chargiez beaucoup de classes inutiles, vous ne devriez pas trop vous soucier de l'utilisation de la mémoire des classes chargées en mémoire.

+0

Quels sont les problèmes que vous avez rencontrés lors du chargement prématuré des classes référencées? Je suis curieux de savoir quel genre de problème ce serait le cas. –

+0

Le problème était que nous avions les mêmes bibliothèques fonctionnant sur le serveur et sur le client. Une partie du chemin de code ne serait pas prise sur le serveur, nous avons donc essayé de supprimer les bibliothèques inutiles qui ne seraient pas appelées. Même si le code n'était pas appelé, l'application planterait au démarrage. – Guillaume

Questions connexes