2009-08-30 4 views

Répondre

2

Si par mémoire statique, vous voulez dire sur la pile, non, tous les objets sont alloués sur le tas. Seules les primitives sont allouées sur la pile. Editer: Je ne suis toujours pas sûr si par dynamique et statique vous entendez tas et pile, respectivement, mais c'est généralement d'où vient la question pour les personnes avec un fond C/C++, parce que ces langues donnent le contrôle du développeur au-dessus de ça.

En Java, lorsque vous faites une typique:

Object o = new Object(); 

Cela va allouer de la mémoire sur le tas. Si l'intérieur d'une méthode que vous faites:

int i = 1; 

Alors que int est alloué sur la pile (si elle est un champ dans une classe, il sera alloué sur le tas).

+0

pouvez-vous s'il vous plaît donner un exemple d'allocation statique et dynamique à la fois ?? –

0

Toute la mémoire d'instance (en appelant new) est allouée sur le tas, tous les paramètres sont alloués sur la pile. Mais les paramètres java (non primitifs) sont tous passés par référence (sauf les primitives).

+2

En Java, tous les paramètres sont transmis par valeur. –

+2

Toutes les instances sont passées par une référence comme un pointeur vers l'instance. À droite, le pointeur est passé par valeur, mais l'appel d'une méthode sur l'objet passé va changer l'original –

+1

Exactement, Java est toujours valeur par passe, ce qui signifie que les références d'objet sont également transmises par valeur (et dans les objets Java sont toujours accédé par une référence). C'est complètement différent du renvoi par référence. http: // stackoverflow.com/questions/40480/is-java-pass-by-reference –

-1

Les réponses affirmant que les non-primitives sont toujours allouées sur le tas sont totalement erronées. Les JVM peuvent faire escape analysis pour déterminer si les objets seront toujours confinés à un seul thread et si la durée de vie de l'objet est limitée par la durée de vie d'une trame de pile donnée. S'il peut déterminer qu'un objet peut être alloué sur la pile, une JVM peut l'y allouer. Pour plus de détails, voir this article. «Statique» ne veut pas dire «sur la pile»

+1

Java 6u14 (lorsque -XX: + DoEscapeAnalysis est activé) utilise l'analyse d'échappement pour le remplacement scalaire, pas l'allocation de pile. Les objets sont * jamais * alloués sur la pile, mais leurs champs sont soulignés et traités comme des variables locales. Voir http://java.sun.com/javase/6/webnotes/6u14.html –

0

Les objets affectés à l'initialisation des variables statiques de classe, ou au static code blocks, sont alloués de manière statique, en ce sens que l'allocation est effectuée au moment du chargement de la classe (qui peut être statique immédiatement après le démarrage du programme).

Vous pourriez, en théorie, écrire un programme Java en utilisant seulement de telles allocations, et ce serait statically allocated, le même qu'un programme C qui n'a jamais appelé malloc, juste eu des tampons fixes pour le truc qu'il voulait faire. Si un tel programme démarre avec succès, cela prouve qu'il y a suffisamment de mémoire disponible pour tout ce qu'il peut faire, et donc il n'obtiendra jamais une erreur de mémoire insuffisante, un problème de fragmentation ou une pause GC.

Il va juste, si correctement écrit, retourner beaucoup de messages d'erreur en disant «Je ne peux pas faire ça».

Questions connexes