Επιδιόρθωση: Παρουσιάστηκε σφάλμα κατά την προετοιμασία του VM δεν μπόρεσε να δεσμεύσει αρκετό χώρο για σωρό αντικειμένων

Παρόλο που οι μικροεφαρμογές Java δεν είναι μια δημοφιλής τεχνολογία ιστού αυτές τις μέρες, υπάρχουν αμέτρητοι λόγοι για την ανάπτυξη μιας εικονικής μηχανής Java απευθείας σε έναν διακομιστή Linux. Εάν προσπαθήσετε να εκτελέσετε την εντολή java του Linux εντελώς είτε σε διακριτό υλικό είτε στο εσωτερικό του δικού του VM, τότε ενδέχεται να εμφανιστεί ένα μήνυμα "Παρουσιάστηκε σφάλμα κατά την εκκίνηση του VM δεν μπόρεσε να κρατήσει αρκετό χώρο για σωρό αντικειμένου".

Αυτό φαίνεται μάλλον περίεργο επειδή πιθανότατα έχετε αρκετή μνήμη RAM για να εκτελέσετε την εντολή, αλλά οφείλεται σε μεγάλο βαθμό σε ένα συγκεκριμένο quirk στον τρόπο με τον οποίο χρησιμοποιούνται οι σελίδες φυσικής και εικονικής μνήμης. Ο καθορισμός ορισμένων σχετικά μεγάλων μεγεθών θα σας επιτρέψει να παρακάμψετε εντελώς αυτό το μήνυμα και να εκτελέσετε την εντολή java όπως θα κάνατε με οποιονδήποτε άλλο.

Μέθοδος 1: Χρήση επιλογών γραμμής εντολών

Εάν έχετε προσπαθήσει να εκτελέσετε το java και λάβετε αυτό το μήνυμα, τότε πιθανότατα έχετε ήδη εκτελέσει την δωρεάν εντολή για να βεβαιωθείτε ότι υπάρχει άφθονη ποσότητα μνήμης για την εκτέλεση του προγράμματος.

java & δωρεάν εντολές

Παρατηρήστε ότι στο μηχάνημα δοκιμής είχαμε περίπου 2,3 GB φυσικής μνήμης RAM και δεν έχει χρησιμοποιηθεί ακόμη μία σελίδα εικονικής μνήμης. Αν παρατηρήσετε ότι έχετε μνήμη, τότε θα θελήσετε να κλείσετε άλλα πράγματα που εκτελείτε πριν το δοκιμάσετε ξανά. Από την άλλη πλευρά, όσοι διαπίστωσαν ότι έχουν άφθονη ελεύθερη μνήμη μπορούν να προσπαθήσουν να καθορίσουν ένα μέγεθος απευθείας.

Για παράδειγμα, στο μηχάνημά μας καταφέραμε να εκτελέσουμε την εντολή ως java -Xms256m -Xmx512M και λειτούργησε όπως θα ήταν διαφορετικά. Αυτό περιορίζει το μέγεθος σωρού που προσπαθεί να δεσμεύσει η εικονική μηχανή Java κατά την εκκίνηση. Δεδομένου ότι μια ανεξέλεγκτη εικονική μηχανή θα μπορούσε υποθετικά να κάνει ασυνήθιστα πράγματα, μπορεί να ρίξει μηνύματα σφάλματος σε ένα κατά τα άλλα δωρεάν σύστημα. Μπορεί επίσης να θέλετε να παίξετε με αυτές τις δύο τιμές προτού βρείτε τον σωστό συνδυασμό.

Αυτό μπορεί να είναι ένα πρόβλημα ανεξάρτητα από το τι το χρησιμοποιείτε, καθώς το JVM δεν έχει καμία σχέση με τον τύπο του VM που μπορεί να χρησιμοποιείτε για την εκτέλεση του GNU / Linux.

Μέθοδος 2: Εξαγωγή των μεταβλητών για να γίνει η μόνιμη αλλαγή

Όταν βρείτε μια τιμή που λειτουργεί, μπορείτε να την εξαγάγετε για να την κάνετε μόνιμη για αυτήν τη συνεδρία. Για παράδειγμα, χρησιμοποιήσαμε την εξαγωγή _JAVA_OPTIONS = '- Xms256M -Xmx512M' από τη γραμμή εντολών bash και μας επέτρεψε να εκτελέσουμε την εντολή java από μόνη της χωρίς άλλες επιλογές μέχρι να αποσυνδεθούμε από τον διακομιστή μας.

Χρειάστηκε να εκτελεστεί ξανά όταν συνδεθήκαμε σε μια άλλη περίοδο λειτουργίας, οπότε ίσως θελήσετε να το προσθέσετε σε οποιαδήποτε σχετικά σενάρια εκκίνησης εάν σκοπεύετε να χρησιμοποιείτε την εντολή java αρκετά συχνά. Προσθέσαμε τη γραμμή στο αρχείο .bash_login και φαινόταν να λειτουργεί κάθε φορά που χρησιμοποιούσαμε μια προτροπή σύνδεσης χωρίς να χρειαστεί να την εκτελέσουμε ξανά, αν και ίσως χρειαστεί να βρείτε άλλη τοποθεσία για αυτό εάν εργάζεστε με διαφορετικό κέλυφος.

Μπορεί να έχετε παρατηρήσει ότι μόνο ορισμένες διαμορφώσεις υλικού ενεργοποιούν αυτό το μήνυμα σφάλματος. Αυτό συμβαίνει επειδή συμβαίνει συνήθως σε μηχανήματα με μεγάλη φυσική μνήμη RAM, αλλά χαμηλότερα πλεονεκτήματα για τον τρόπο χρήσης του. Η Java θα προσπαθήσει να εκχωρήσει ένα τεράστιο μπλοκ μόνο για να πει ότι δεν μπορεί, το οποίο ερμηνεύει ως εξάντληση της μνήμης.

Μέθοδος 3: Εκτύπωση τρεχουσών επιλογών Java

Εάν εργάζεστε στη γραμμή εντολών και θέλετε μια γρήγορη αναφορά σε αυτό που έχετε ορίσει την τιμή _JAVA_OPTIONS, τότε εκτελέστε απλώς το echo $ _JAVA_OPTIONS και θα εκτυπώσει αμέσως τις τρέχουσες τιμές. Αυτό είναι χρήσιμο για την αντιμετώπιση προβλημάτων όταν προσπαθείτε να καταλάβετε τους σωστούς αριθμούς για να δοκιμάσετε.

Λάβετε υπόψη ότι αν και αυτή η επιδιόρθωση δεν θα απαιτούσε άλλο παιχνίδι, η Java θα σβήσει το μήνυμα "δεν μπορούσε να κρατήσει αρκετό χώρο για σωρό αντικειμένων" εάν βρεθείτε ποτέ πραγματικά στο σύντομο τέλος της εικονικής μνήμης. Εάν συμβαίνει αυτό, τότε θα θέλετε να ελέγξετε ξανά ποιες διαδικασίες εκτελούνται αυτήν τη στιγμή και, ενδεχομένως, να επανεκκινήσετε τον διακομιστή, εάν αυτή είναι μια επιλογή. Θα μπορούσατε επίσης να δημιουργήσετε περισσότερο χώρο ανταλλαγής, αλλά εάν πρόκειται για ζήτημα, είναι γενικά καλύτερο να το δοκιμάσετε και να το διορθώσετε με κάποιο άλλο τρόπο.

Σε μια σπάνια περίπτωση που οι ρυθμίσεις σας φαίνεται να είναι σωστές, αλλά εξακολουθεί να μην λειτουργεί, βεβαιωθείτε ότι έχετε εγκαταστήσει το πακέτο 64-bit Java, καθώς θα πρέπει να είναι απρόσβλητο από αυτό το πρόβλημα. Οι απαιτήσεις συνεχόμενης μνήμης ισχύουν μόνο για την έκδοση 32 bit της Java. Βρήκαμε σε μερικές περιπτώσεις ότι η έκδοση 64-bit προσπάθησε να δημιουργήσει μια εικονική μηχανή 32-bit, ορίζοντας έτσι την επιλογή -d64 στη γραμμή εντολών το διόρθωσε για εμάς.