2010-04-30 6 views
1

Je suis en train de mettre en œuvre un algorithme de programmation dynamique pour le problème du sac à dos en Java. Je déclare le tableau puis initialise sa taille pour être [nombre d'objets] [capacité du sac à dos].Supprimer une partie d'un tableau en Java pour libérer de la mémoire sur un tas

Lorsque mon nombre d'objets ou ma capacité devient trop important, j'obtiens une erreur de mémoire car je manque d'espace sur le tas. Mes questions sont les suivantes: Si je supprime des lignes de mon double tableau au fur et à mesure, Java va-t-il libérer la mémoire en la supprimant? Ou est-ce que Java réserve cet espace de mémoire pour la taille du tableau que j'ai créé à l'origine? Si c'est le dernier, existe-t-il un moyen de libérer manuellement la mémoire en Java?

Merci pour votre aide!

Répondre

5

La réponse est « oui » - si vous utilisez des tableaux comme ceci:

private void foo() { 
    int[][] bar = new int[10][10]; 
    bar[1] = null; 
    //at this point, the array that was in bar[1] is eligible for garbage collection 
    //unless someone else has a reference to it 
} 
+0

Mais la JVM ne retournera pas cette mémoire au système d'exploitation (du moins pas sous Windows) mais la gardera pour un usage futur (à moins que je comprenne mal ce que l'OP n'a pas besoin?) - mhh peut-être pas -) – OscarRyz

+0

J'ai vu la mémoire JVM retourner la mémoire à l'OS (Windows XP). C'est seulement quand un grand pourcentage du tas est libéré. –

+0

Merci! Je vais essayer, et j'espère que cela fonctionnera. – kate

1

Il devrait libérer la mémoire un peu plus tard, pas nécessairement lorsque vous enlevez les lignes. Il va cependant réutiliser cette mémoire pour de nouvelles données.

Probablement vous êtes en cours d'exécution avec à peu de RAM, essayez d'augmenter l'aide:

java -Xmx128m you.app.Main 

Ceci exécutera votre application avec 128 Mo de RAM.

+0

Tant qu'il peut réutiliser la mémoire pour de nouvelles données je devrais être ok. Je veux être en mesure d'ajouter de nouvelles lignes que je supprime les anciennes lignes. Je vous remercie! – kate

1

Oui, il fonctionne. Java n'a pas de tableaux multidimensionnels mais seulement des tableaux dentelés (tableaux de tableaux). Ainsi, le premier tableau est essentiellement un tableau de pointeurs vers les véritables tableaux de contenus.

Cela a l'effet positif que lorsque vous affectez un nouveau tableau à l'une des zones en escalier, l'ancien peut être collecté. (voir la réponse de Sbodd pour un exemple)

+0

Merci pour l'explication. – kate

1

il n'est pas possible de libérer de la mémoire d'une partie du tableau ... parce que dans java vous ne pouvez pas supprimer des éléments du tableau .. au lieu de cela vous pouvez traverser ce tableau et stocker dans un autre tableau de la taille requise ....

Questions connexes