2017-10-11 8 views
3

J'essaie de comprendre le principe de fonctionnement des algorithmes de collecte de grabage. Je lis ceci article. Autant que j'ai compris chaque allocation se passe en Jeune génération. S'il n'y a pas assez d'espace disponible Minor GC est déclenché pour nettoyer la jeune génération (Eden, S1, S2). Mais imaginez maintenant que nous avons une classe comme:Comprendre l'allocation de mémoire et le GC en Java

public class TestYoungCrash{ 
    private long l1; 
    private long l2; 
    //... 
    private long l100000000; 
    //tons of other fields 
} 

donc l'objet de la classe ne correspond pas à la jeune génération, même si la génération est tout à fait claire.

Que va-t-il se passer alors? Est-ce normalisé?

Répondre

5

Il n'est pas possible d'avoir un seul objet nécessitant une telle quantité de mémoire. Mais pas à cause des limites de mémoire, mais pour une raison plus pratique - la limite JVM le nombre de champs par classe, voir here:

Le nombre de champs qui peuvent être déclarés par une classe ou d'une interface est limitée à 65535 par la taille de l'élément fields_count de la structure ClassFile (§4.1).

Vous ne pouvez pas avoir autant de champs dans votre classe que vous pourriez faire exploser la mémoire. Je suis assez sûr: si vous démarrez une JVM avec un tas si petit qu'un seul objet contenant ces 65535 longs champs ne rentrerait pas ... la JVM ne commencerait probablement même pas.

En ce sens, nous pourrions reformuler votre question en quelque chose comme: que se passe-t-il lorsque je crée un tableau trop grand pour tenir dans l'espace de tas fourni à la JVM? Et puis vous êtes fondamentalement de retour à ce question ... qui dit: OutOfMemoryError.

+0

Nous pouvons redimensionner la Young Generationg, n'est-ce pas? –

+0

Semble raisonnable, en fait. Je vous remercie. –

+0

Vous êtes les bienvenus ;-) – GhostCat