Προς το περιεχόμενο

OutOfMemoryError Java


Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

έχω έναν φάκελο μεγέθους 184,1MB με txt αρχεία όπου ύστερα από επεξεργασία καθενός από αυτά παίρνω ένα τμήμα τους και το

κάνω add σε ένα arraylist από string.Ενώ μέχρι κάποιο σημείο γίνεται κανονικά add στη λίστα μετά μου πετάει:

>Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Το πρόγραμμα το τρέχω σε netbeans και εχω θέσει -Xms512m -Xmx1024m (!).

Ξέρει κανείς τι γίνεται;

Δημοσ.

Οριακά δεν μου την καταναλώνει όλη δηλαδή τη στιγμή που μου πετάει το error από total 2052996k είμαι γύρω στα

2000000k(-). Το πρόγραμμα το τρέχω σε netbook..

Δημοσ.
Έχεις τσεκάρει μήπως στον αλγόριθμό σου υπάρχει κάποιο memory leak;

 

Εννοείς να χρησημοποιήσω κάποιο εργαλείο;Αν ναι ποιό;

Τα ίδια απότελεσματα έχω και σε pc με 4gb ram..

Δημοσ.
Γιααα διάβασε αυτό εδώ

http://java.sun.com/...2SE/monitoring/

 

Προσωπικά χρησιμοποιώ netbeans οπότε δες κι αυτό

http://netbeans.org/...gleaks_pt1.html

 

To link για το netbeans δείχνει αρκετα χρήσιμο αλλά δυστυχώς είμαι πάλι στο netbook και η οθόνη μου

είναι πολύ μικρή για να το χειριστώ.Όταν θα πάω στο pc θα το δω αναλυτικά και θα σου πω αν βοήθησε..

Δημοσ.

Έγινε ενημέρωσε να το έχουμε στα υπόψιν αν προκύψει πάλι αντίστοιχο πρόβλημα. Δε μου έχει τύχει μέχρι στιγμής :P

Δημοσ.

Έχεις τσεκάρει μήπως στον αλγόριθμό σου υπάρχει κάποιο memory leak;

 

Memory leak με την κλασσική έννοια δεν μπορεί εκ φύσης να έχει γιατί είναι Java == garbage collected.

Δημοσ.

Δεν ισχύει αυτό, γιατί αρχικά ο garbage collector δεν είναι σίγουρο ότι θα τρέξει πάντα (μερικές φορές ακόμα και ποτέ). Στην περίπτωση του φίλου μας που του πέταξε το συγκεκριμένο Error, τα memory leaks είναι η πιο πιθανή αιτία. Ένα αντικείμενο δεν θεωρείται υποψήφιο προς διαγραφή από τον garbage collector παρά μόνο όταν δεν υπάρχουν αναφορές προς αυτό. Οπότε chaos686 επειδή βάζεις τα String σε μια ArrayList, από εκεί ίσως να έπρεπε να ξεκινήσεις το memory leak inspection, γιατί ίσως παραμένουν πολλές αναφορές προς "άχρηστα" αντικείμενα.

Δημοσ.
επειδή βάζεις τα String σε μια ArrayList, από εκεί ίσως να έπρεπε να ξεκινήσεις το memory leak inspection, γιατί ίσως παραμένουν πολλές αναφορές προς "άχρηστα" αντικείμενα.

 

Δεν έχω βρει ακριβώς γιατί γίνεται αυτό ακόμα αλλά έχεις σίγουρα δίκιο καθώς το πρόγραμμα τρέχει μιά χαρά αν δεν

κρατάω τα String στο arraylist και απλά π.χ μετράω πόσα είναι(και είναι πολλά!).

Μόλις μπορέσω θα ενημερώσω για λεπτομέριες.

Ευχαριστώ για τις απαντήσεις.

Δημοσ.

Δεν ισχύει αυτό, γιατί αρχικά ο garbage collector δεν είναι σίγουρο ότι θα τρέξει πάντα (μερικές φορές ακόμα και ποτέ). Στην περίπτωση του φίλου μας που του πέταξε το συγκεκριμένο Error, τα memory leaks είναι η πιο πιθανή αιτία. Ένα αντικείμενο δεν θεωρείται υποψήφιο προς διαγραφή από τον garbage collector παρά μόνο όταν δεν υπάρχουν αναφορές προς αυτό. Οπότε chaos686 επειδή βάζεις τα String σε μια ArrayList, από εκεί ίσως να έπρεπε να ξεκινήσεις το memory leak inspection, γιατί ίσως παραμένουν πολλές αναφορές προς "άχρηστα" αντικείμενα.

 

Ο garbage collector δεν μπορείς να προβλέψεις πότε ακριβώς θα τρέξει, αλλά είναι σίγουρο ότι θα τρέξει όταν το JVM δει ότι ζητάς μνήμη αλλά αυτή που έχει στη διάθεσή του λιγοστεύει επικίνδυνα -- το αντίθετο θα ήταν απλώς ηλίθιο και αυτοί που το έγραψαν δεν είναι ηλίθιοι.

 

Απο και και πέρα, γι' αυτό ακριβώς είπα "με την κλασική έννοια". Αν βάλεις ένα δισεκατομμύριο strings μέσα σε ένα container, αυτό είναι κακός προγραμματισμός όχι memory leak.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...