Πότε εμφανίζεται ένα OutOfMemonryException; Αν προσπαθήσουμε να δημιουργήσουμε ένα νέο αντικείμενο και ο συλλέκτης σκουπιδιών δεν μπορεί να βρει ελεύθερη μνήμη, μπορούμε να πιάσουμε την εξαίρεση. Μια άλλη περίπτωση είναι ότι όταν το CLR χρειάζεται μνήμη και το σύστημα δεν μπορεί να την παρέχει, θα γίνει και η εξαίρεση. Αλλά σε αυτό το σημείο, η εφαρμογή μας δεν μπορεί να εντοπίσει το σφάλμα.
Ανάλυση εντοπισμού σφαλμάτων υπερχείλισης μνήμης (OutOfMemoryException).
Ο χώρος διευθύνσεων του λειτουργικού συστήματος 32-bit είναι 4G, εκ των οποίων το 2G καταλαμβάνεται από το λειτουργικό σύστημα, πράγμα που σημαίνει ότι η μνήμη που απομένει για τη διαδικασία χρήστη είναι μόνο 2G (το οποίο αφαιρεί επίσης μέρος του χώρου που καταλαμβάνει η εικόνα κατά τη φόρτωση του προγράμματος, γενικά μόνο περίπου 1.6G~1.8G μπορεί να χρησιμοποιηθεί). Εάν μια διεργασία χρειάζεται να ζητήσει μνήμη ενώ εκτελείται και το λειτουργικό σύστημα δεν μπορεί να εκχωρήσει χώρο μνήμης σε αυτήν, θα δημιουργήσει μια εξαίρεση εκτός μνήμης, System.OutOfMemoryException in .net (Η εξαίρεση που δημιουργείται όταν δεν υπάρχει αρκετή μνήμη για να συνεχιστεί η εκτέλεση ενός προγράμματος.). Αν και η τελική εκδήλωση είναι το OutOfMemoryException, η αιτία μπορεί να είναι διαφορετική και πριν από την επίλυση αυτού του προβλήματος, είναι απαραίτητο να αναλυθεί η τρέχουσα κατάσταση χρήσης μνήμης της διαδικασίας για να βρεθεί η σωστή αιτία πριν συνταγογραφηθεί το σωστό φάρμακο. Ακολουθούν ορισμένες συμβουλές για τον εντοπισμό σφαλμάτων τέτοιων προβλημάτων.
Για περισσότερες πληροφορίες, ανατρέξτε στο:http://blog.csdn.net/lazyleland/article/details/6704661
iis Application Pool Memory Overflow Error System.OutOfMemoryException
Σε έναν ASP.NET διακομιστή web, η ποσότητα μνήμης που μπορεί να χρησιμοποιήσει ASP.NET συνήθως δεν είναι ίση με όλη την ποσότητα μνήμης. Στο αρχείο διαμόρφωσης machine.config, <processModel>υπάρχει μια ιδιότητα "memoryLimit" στην ενότητα διαμόρφωσης, η τιμή αυτής της ιδιότητας είναι μια ποσοστιαία τιμή, η προεπιλογή είναι "60", δηλαδή, η διαδικασία ASP.NET (μπορείτε να δείτε τη διαδικασία ASP.NET στη διαχείριση εργασιών, aspnet_wp στο IIS5, w3wp στο IIS6) μπορεί να χρησιμοποιήσει το 60% όλης της φυσικής μνήμης. Όταν η ποσότητα μνήμης που χρησιμοποιείται από ASP.NET υπερβεί αυτό το όριο, οι υπηρεσίες IIS θα ξεκινήσουν αυτόματα την ανακύκλωση της διαδικασίας, δηλαδή τη δημιουργία μιας νέας διεργασίας για το χειρισμό αιτήσεων Http και την ανάκτηση της μνήμης που καταλάμβανε η παλιά διεργασία.
Όταν έχουμε διακομιστή με μεγάλη μνήμη, η τιμή του "memoryLimit" πρέπει να ρυθμιστεί κατάλληλα. Για παράδειγμα, αν προετοιμάσουμε έναν διακομιστή με chemas-microsoft-com ffice marttags" />t="on"> μνήμη 4G, τότε t="on">4G×60%=t="on">2.4G. Ωστόσο, για λειτουργικά συστήματα Win32, όλος ο χώρος μνήμης που μπορεί να καταλάβει μια διεργασία είναι μόνο t="on">2G. Όταν η μνήμη που καταλαμβάνεται από τη διεργασία ASP.NET αρχίσει να φτάνει t="on">2G, επειδή δεν φτάνει το "κατώφλι ανακύκλωσης" του t="on">2.4G, οι υπηρεσίες IIS δεν θα ξεκινήσουν τη λειτουργία της διαδικασίας ανακύκλωσης, αλλά λόγω των περιορισμών του Win32, είναι στην πραγματικότητα αδύνατο να εκχωρηθεί περισσότερη μνήμη σε αυτήν τη διαδικασία, επομένως το OutOfMemoryException είναι πιθανό να πεταχτεί. Για να αποφευχθεί αυτό, έπρεπε να μειώσουμε κατάλληλα το "memoryLimit", ώστε οι υπηρεσίες IIS να μπορούν να επεξεργαστούν την ανακύκλωση νωρίτερα.
Η Microsoft συνιστά ASP.NET διαδικασία να καταλαμβάνει όχι περισσότερο από το 60% της μνήμης και είναι καλύτερο να κάνετε την υπολογιζόμενη πραγματική τιμή όχι μεγαλύτερη από t="on">800M. Τούτου λεχθέντος, για έναν διακομιστή με t="on" > μνήμη 4G, είναι καλύτερο να ορίσετε την ιδιότητα "memoryLimit" σε "20". Ο ορισμός ενός κατάλληλου ορίου ανακύκλωσης για τις υπηρεσίες IIS για την έγκαιρη ανακύκλωση των διεργασιών είναι πολύ σημαντικός για τη διασφάλιση της σταθερής λειτουργίας ολόκληρου του διακομιστή και την αποφυγή της εξαίρεσης OutOfMemoryException.
Στο IIS6, το όριο ανακύκλωσης για τις διεργασίες ASP.NET δεν καθορίζεται πλέον από την ιδιότητα "memoryLimit" στην ενότητα ρύθμισης παραμέτρων, αλλά από τις ρυθμίσεις στη ρύθμιση παραμέτρων του χώρου συγκέντρωσης εφαρμογών στη IIS Manager.
Ωστόσο, ακόμα κι αν αυτές οι διαμορφώσεις έχουν ρυθμιστεί σωστά, δεν υπάρχει καμία εγγύηση ότι οι εξαιρέσεις εκτός μνήμης θα αποφευχθούν εντελώς και οι λόγοι μπορεί να είναι ποικίλοι και περίπλοκοι, όπως οι λειτουργίες ανάκτησης μνήμης μπορεί να είναι πολύ χρονοβόρες. Οι προγραμματιστές θα πρέπει πάντα να έχουν κατά νου να μην χρησιμοποιούν και να σπαταλούν άσκοπα μνήμη στον κώδικά τους. :)
Εάν έχετε διακομιστή με μεγάλη μνήμη και είστε απογοητευμένοι από το όριο χρήσης μνήμης t="on" >2G στο λειτουργικό σύστημα Win32, υπάρχουν δύο εναλλακτικές λύσεις:
- Ξεκινήστε τον υπολογιστή σε λειτουργία /3GB και ακολουθήστε τη σύνδεση μετά το άρθρο συμμετοχής στη μέθοδο
- Χρήση του Windows Server 2003 έκδοση 64 bit
Πολλά στοιχεία για την αποφυγή υπερχείλισης μνήμης
Εάν θέλετε να δημιουργήσετε έναν πίνακα, βεβαιωθείτε ότι έχει το σωστό μέγεθος.
Βεβαιωθείτε ότι έχετε αρκετή μνήμη για εσωτερική χρήση και νέα φιλοξενούμενα αντικείμενα.
Εάν προγραμματίζετε στο .NET Compact Framework, ο χρόνος εκτέλεσης της δημόσιας γλώσσας δημιουργεί αυτήν την εξαίρεση όταν δεν υπάρχει αρκετή μνήμη για εσωτερική χρήση ή για ένα νέο διαχειριζόμενο αντικείμενο. Για να αποφύγετε αυτήν την εξαίρεση, θα πρέπει να αποφύγετε τη σύνταξη μεγάλων μεθόδων που καταλαμβάνουν 64 KB ή περισσότερο μνήμης.
Η υπερβολική χρήση διαχειριζόμενης μνήμης προκαλείται συχνά από:
- Ανάγνωση μεγάλων συνόλων δεδομένων στη μνήμη.
- Δημιουργία πάρα πολλών καταχωρήσεων στο cache.
- Ανεβάστε ή κατεβάστε μεγάλα αρχεία.
- Χρησιμοποιήστε πάρα πολλές κανονικές εκφράσεις ή συμβολοσειρές κατά την ανάλυση αρχείων.
- Κατάσταση υπερβολικής προβολής.
- Υπάρχουν πάρα πολλά δεδομένα ή πάρα πολλές περίοδοι λειτουργίας στην κατάσταση συνεδρίας.
- Αυτή η εξαίρεση μπορεί να προκύψει όταν καλείται μια μέθοδος σε ένα αντικείμενο COM και η μέθοδος επιστρέφει έναν τύπο που ορίζεται από το χρήστη που περιέχει έναν ασφαλή πίνακα (έναν πίνακα απροσδιόριστων μεγεθών) με ένα πρόσθετο μήνυμα "Δεν υπάρχει αρκετός χώρος αποθήκευσης για την ολοκλήρωση αυτής της λειτουργίας". Αυτό συμβαίνει επειδή το .NET Framework δεν μπορεί να ομαδοποιήσει δομικά πεδία με ασφαλείς τύπους συστοιχιών.
Ένα παράδειγμα υπέρβασης μνήμης που προκαλείται από ακατάλληλη χρήση πινάκων byte
Εάν το αρχείο εξόδου είναι ιδιαίτερα μεγάλο, μπορεί να αναφέρει απευθείας το System.OutOfMemoryException. Ο σωστός τρόπος για να το κάνετε αυτό είναι να εξάγετε τη ροή byte του αρχείου σε τμήματα, αλλά υπάρχει asp.net έτοιμη μέθοδος Response.WriteFile(filePath) που κάνει ακριβώς αυτό.
Ο σωστός τρόπος γραφής είναι ο εξής:
Όταν ένα asp.net αντιμετωπίζει υπερχείλιση μνήμης, ένας εύκολος τρόπος για να το αντιμετωπίσετε είναι να ανακτήσετε αμέσως τη δεξαμενή εφαρμογών. Αλλά αυτό δεν έλυσε εντελώς το πρόβλημα.
Υπερχείλιση μνήμης κατά τη δημιουργία ενός τύπου ειδώλου (System.OutOfMemoryException)
Κωδικός σφάλματος: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. Ονοματεπώνυμο);
Εξαιρέσεις που εμφανίζονται όταν ένα ανοιχτό αρχείο δεν είναι αρχείο εικόνας:
MSDN: Αυτή η μέθοδος δημιουργεί μια εξαίρεση OutOfMemoryException εάν το αρχείο δεν έχει έγκυρη μορφή εικόνας ή εάν το GDI+ δεν υποστηρίζει τη μορφή pixel του αρχείου.
Τέτοιες μη φυσιολογικές πληροφορίες είναι εύκολα παραπλανητικές.
<processModel> στοιχείο
Ρυθμίστε τις παραμέτρους του μοντέλου διεργασίας ASP.NET στο διακομιστή Web των υπηρεσιών Internet Information Services (IIS). Η ενότητα μπορεί να οριστεί μόνο στο αρχείο Machine.config <processModel> και επηρεάζει όλες τις ASP.NET εφαρμογές που εκτελούνται στο διακομιστή.
Προειδοποίηση Για πληροφορίες σχετικά με αυτό το στοιχείο, διαβάστε την ενότητα "Σημειώσεις".
Παράδειγμα διαμόρφωσης της δομής:
εξήγηση
Το διαχειριζόμενο σύστημα διαμόρφωσης κώδικα δεν διαβάζει <processModel> τις ρυθμίσεις διαμόρφωσης. Αντίθετα, διαβάζεται απευθείας από το μη διαχειριζόμενο aspnet_isapi.dll DLL. Οι αλλαγές σε αυτήν την ενότητα τίθενται σε ισχύ μετά την επανεκκίνηση των υπηρεσιών IIS.
Εάν εγκαταστήσετε ASP.NET σε έναν ελεγκτή τομέα, πρέπει να ακολουθήσετε ειδικά βήματα, διαφορετικά η εγκατάσταση δεν θα λειτουργήσει. Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα Βρίσκεται στοhttp://support.microsoft.comΤο άρθρο της Microsoft στη Γνωσιακή Βάση CHS315158 "ASP.NET δεν μπορεί να χρησιμοποιήσει τον προεπιλεγμένο λογαριασμό ASPNET σε ελεγκτές τομέα".
Όταν ASP.NET εκτελείται σε εγγενή λειτουργία IIS έκδοση 6, χρησιμοποιεί το μοντέλο διεργασίας IIS 6 και αγνοεί <processModel> τις ρυθμίσεις στην ενότητα. Για να ρυθμίσετε τις παραμέτρους της ταυτότητας διεργασίας, της ανακύκλωσης ή άλλων τιμών μοντέλου διεργασίας, χρησιμοποιήστε το περιβάλλον εργασίας χρήστη της Διαχείρισης υπηρεσιών Internet για να ρυθμίσετε τις παραμέτρους των διεργασιών IIS για την εφαρμογή σας.
Η τιμή ώρας μορφοποιείται ως "ώρες:λεπτά:δευτερόλεπτα". Εάν δίνεται μόνο ένας αριθμός χωρίς άνω και κάτω τελεία, η τιμή θεωρείται ότι είναι λεπτά. Επομένως, το timeout="4" ισοδυναμεί με το timeout="00:04:00".
Εάν μια εφαρμογή ASP.NET προκαλέσει επανεκκίνηση ASP.NET διεργασιών (Aspnet_wp.exe στα Windows 2000 και Windows XP Professional και W3wp.exe στον Windows Server 2003) και εμφανίσει ένα μήνυμα λάθους που υποδεικνύει ότι η επανεκκίνηση οφείλεται σε ύποπτη κατάσταση αδιεξόδου, θα πρέπει να αυξηθεί responseDeadlockInterval ρύθμιση.
Αποθηκεύστε ονόματα χρήστη και κωδικούς πρόσβασης στο μητρώο
Αποθηκεύστε ονόματα χρήστη και κωδικούς πρόσβασης στο μητρώο
Για να κρυπτογραφήσετε ονόματα χρήστη και κωδικούς πρόσβασης και να τα αποθηκεύσετε στο μητρώο, ορίστε το όνομα χρήστη και τον κωδικό πρόσβασης ως εξής.
userName="μητρώο:HKLM\Software\AspNetProcess,Name"
password="μητρώο:HKLM\Software\AspNetProcess,Pwd"
Το τμήμα της συμβολοσειράς που ακολουθεί το μητρώο λέξεων-κλειδιών και πριν από το κόμμα υποδεικνύει το όνομα του κλειδιού μητρώου που ανοίγει ASP.NET. Το τμήμα μετά το κόμμα περιέχει ένα όνομα τιμής συμβολοσειράς από το οποίο το ASP.NET θα διαβάσει τα διαπιστευτήρια. Απαιτούνται κόμματα και τα διαπιστευτήρια πρέπει να αποθηκεύονται στη μονάδα διαμόρφωσης HKLM. Εάν η διαμόρφωση δεν έχει μορφοποιηθεί σωστά, ASP.NET δεν θα ξεκινήσει τη διεργασία και στη συνέχεια θα εμφανιστεί στη διαδρομή του κωδικού αποτυχίας δημιουργίας τρέχοντος λογαριασμού.
Τα διαπιστευτήρια πρέπει να είναι σε REG_BINARY μορφή και να περιέχουν την έξοδο μιας κλήσης στη λειτουργία API των Windows CryptProtectData. Μπορείτε να δημιουργήσετε και να αποθηκεύσετε διαπιστευτήρια κρυπτογράφησης στο μητρώο με την εφαρμογή Κονσόλα μητρώου ρυθμίσεων ASP.NET (Aspnet_setreg.exe), η οποία χρησιμοποιεί το CryptProtectData για την ολοκλήρωση της κρυπτογράφησης. Για να κατεβάσετε τον πηγαίο κώδικα Aspnet_setreg.exe και Visual C++ και να βοηθήσετε, επισκεφτείτε τον ιστότοποwww.asp.netκαι αναζητήστε "aspnet_setreg".
Θα πρέπει να ρυθμίσετε την πρόσβαση στα κλειδιά μητρώου που αποθηκεύουν κρυπτογραφημένα διαπιστευτήρια, έτσι ώστε η πρόσβαση να είναι διαθέσιμη μόνο στους διαχειριστές και το SYSTEM. Επειδή το κλειδί μητρώου θα διαβαστεί από τη διεργασία ASP.NET που εκτελείται ως SYSTEM, θα πρέπει να ορίσετε τα ακόλουθα δικαιώματα:
Administrators:F
SYSTEM:F
ΔΗΜΙΟΥΡΓΌΣ ΙΔΙΟΚΤΉΤΗΣ:F
ProcessAccount:R
Αυτό θα παρέχει δύο γραμμές άμυνας για την προστασία των δεδομένων:
Τα δικαιώματα ACL απαιτούν πρόσβαση σε δεδομένα με την ταυτότητα του Διαχειριστή. Ο εισβολέας θα πρέπει να εκτελέσει κώδικα (CryptUnprotectData) στον διακομιστή για να ανακτήσει τα διαπιστευτήρια του λογαριασμού.
παράδειγμα
Το παρακάτω παράδειγμα καθορίζει διάφορες <processModel> ρυθμίσεις διαμόρφωσης.
Το παρακάτω παράδειγμα καθορίζει ότι το κρυπτογραφημένο όνομα χρήστη και ο κωδικός πρόσβασης αποθηκεύονται στο στοιχείο μητρώου που ορίζεται από το χρήστη AspNetProcess.
Απαιτήσεις
- Περιλαμβάνεται στο: <system.web>
- Πλατφόρμα Web: IIS 5.0, IIS 5.1, IIS 6.0
- Αρχεία διαμόρφωσης: Machine.config, Web.config
- Πρόγραμμα χειρισμού ενότητας διαμόρφωσης: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|