10
votes

Le Java JVM charge-t-il un bocal complet ou une oreille s'il n'en utilise qu'une classe?

Prétendons prétendre que vous avez un fichier JAR de 3 Go et votre application utilise uniquement une petite classe en informatique. Le JVM charge-t-il le fichier JAR entier en mémoire ou lit-il la table des matières et ne charge que les pièces dont il a besoin? Ce comportement est-il contrôlable?


0 commentaires

4 Réponses :


7
votes

JVM charge uniquement les classes requises du pot lorsqu'il est invoqué. Si l'application nécessite une classe, la classe et toutes les autres classes dépendantes seront chargées. Pas sûr, mais je suppose que cela relève de la responsabilité du chargeur de classe de localiser la classe de la classe de classe et de la charge.


0 commentaires

0
votes

Le chargeur de classe par défaut ne charge que ce dont il a besoin, quand il en a besoin. Si vous avez un bocal de 10 Mo dans votre classe de classe, et un seul fichier .Class est nécessaire, le JVM ne chargera que cette classe la première fois que votre code tente d'y accéder. Le bytecode .Class passe dans l'espace de permanence.

C'est "contrôlable" en ce sens que vous pouvez écrire votre propre chargeur de classe, mais il faut une expertise pour le faire.


0 commentaires

1
votes

Cela dépend entièrement de JVM et de Classloader. JVM SPEC Spécifie la classe Devant apparaître à charger sur sa première utilisation active. Les chargeuses de classe peuvent charger certaines des classes plus tôt que nécessaire dans l'anticipation. En réalité, la plupart des chargeurs de classe retardent le chargement aussi longtemps que possible.


0 commentaires

2
votes

Les fichiers JAR sont une forme de fichiers zip.

Comment ceux-ci sont traités est fortement dépendant de JRE.

Les anciennes versions du Sun Jre utilisées dans la carte mémoire dans l'ensemble du fichier. Cela allouerait la mémoire logique, mais ne causerait pas nécessairement que l'une des données à charger du disque. (Les fenêtres 32 bits ne sont généralement pas capables d'attribuer 3 Go de mémoire contiguë, bien que vous puissiez le faire sur d'autres OSS).

Je pense que le comportement actuel est de la mémoire de la mémoire du répertoire central à l'arrière du fichier sous Windows. Sous d'autres osses, il est juste de lire. Ceci est contrôlé par #define S dans la source.

JDK7 est susceptible de faire autre chose.

Les classes sont généralement chargées paresseusement. Les ressources sont reliées à chaque fois. java.util.resourcebundle caches.


0 commentaires