Was sind Speicherlecks und Speicherüberl?ufe in Java?
Sep 22, 2021 pm 05:48 PMSpeicherverlust bedeutet, dass das Programm, nachdem es Speicher beantragt hat, den zugewiesenen Speicherplatz nicht freigeben kann. Speicherüberlauf bedeutet, dass, wenn das Programm Speicher beantragt, nicht genügend Speicher für den Antragsteller vorhanden ist oder Speicherplatz zum Speichern von Int-Daten bereitgestellt wird, aber lange Daten gespeichert werden, was dazu führt, dass der Speicher nicht ausreicht Es wird ein OOM-Fehler gemeldet. Die Anh?ufung von Speicherlecks führt schlie?lich zu einem Speicherüberlauf.
Die Betriebsumgebung dieses Tutorials: Windows7-System, Java8-Version, DELL G3-Computer.
1. Speicherleck:
bedeutet, dass das Programm den zugewiesenen Speicherplatz nicht freigeben kann, aber die Konsequenz angesammelter Speicherlecks ist überlauf.
2. Speicherüberlauf:
bedeutet, dass, wenn das Programm Speicher beantragt, nicht genügend Speicher für den Antragsteller vorhanden ist, oder mit anderen Worten, Ihnen wird Speicherplatz zum Speichern von Daten vom Typ int zur Verfügung gestellt Wenn Sie jedoch lange Datentypen speichern, reicht der Speicher nicht aus und es wird ein OOM-Fehler gemeldet, der sogenannte Speicherüberlauf.
3. Die Beziehung zwischen den beiden:
Die Anh?ufung von Speicherlecks führt schlie?lich zu einem Speicherüberlauf
Speicherüberlauf bedeutet, dass der von Ihnen gewünschte Speicherplatz den tats?chlich vom System zugewiesenen Speicherplatz übersteigt Zu diesem Zeitpunkt ist das System nicht in der Lage, Ihre Anforderungen zu erfüllen. Es wird ein Speicherüberlauffehler gemeldet.
Speicherverlust bedeutet, dass Sie beim System die Zuweisung von Speicher zur Verwendung (neu) beantragen, ihn aber nach der Verwendung nicht zurückgeben (l?schen). Infolgedessen k?nnen Sie nicht mehr auf den Speicher zugreifen, den Sie beantragt haben (vielleicht Sie). put it (Die Adresse des Programms geht verloren) und das System kann sie nicht wieder dem gewünschten Programm zuordnen. Dies entspricht der Anmietung eines Schranks mit Schlüssel. Nachdem Sie Ihre Sachen verstaut und den Schrank verschlossen haben, verlieren Sie den Schlüssel oder geben ihn nicht zurück. Das Ergebnis ist, dass der Schrank von niemandem benutzt werden kann und nicht in den Müll gegeben werden kann recycelt, weil keine Informationen über ihn gefunden werden k?nnen.
Speicherüberlauf: Ein Teller kann nach dem Ausprobieren verschiedener Methoden nur 4 Früchte aufnehmen. Sie haben 5 hineingelegt, aber sie sind zu Boden gefallen und konnten nicht gegessen werden. Das ist überlauf. Wenn beispielsweise ein Stapel verschoben wird, wenn der Stapel voll ist, kommt es zu einem Speicherplatzüberlauf, der als überlauf bezeichnet wird. Wenn ein Stapel zurückgeschoben wird, wenn der Stapel leer ist, kommt es zu einem Speicherplatzüberlauf, der als Unterlauf bezeichnet wird. Das hei?t, der zugewiesene Speicher reicht nicht aus, um die Folge von Datenelementen aufzunehmen, was als Speicherüberlauf bezeichnet wird. Um es ganz klar auszudrücken: Ich kann so viel nicht ertragen, deshalb werde ich einen Fehler melden.
4. Klassifizierung von Speicherlecks (klassifiziert nach der Art ihres Auftretens)
H?ufige Speicherlecks. Code mit Speicherverlusten wird mehrmals ausgeführt, was bei jeder Ausführung zu einem Speicherverlust führt.
Gelegentliche Speicherlecks. Code, der Speicherverluste verursacht, tritt nur unter bestimmten Umst?nden oder Vorg?ngen auf. H?ufig und sporadisch sind relativ. Unter bestimmten Umst?nden kann das, was gelegentlich vorkommt, zur Normalit?t werden. Daher sind die Testumgebung und die Testmethoden für die Erkennung von Speicherlecks von entscheidender Bedeutung.
Einmaliger Speicherverlust. Der Code, der einen Speicherverlust verursacht, wird nur einmal ausgeführt, oder aufgrund von Algorithmusfehlern wird immer nur ein einziger Speicherblock verloren gehen. Wenn beispielsweise im Konstruktor einer Klasse Speicher zugewiesen wird, der Speicher jedoch im Destruktor nicht freigegeben wird, tritt der Speicherverlust nur einmal auf.
Impliziter Speicherverlust. Das Programm reserviert w?hrend der Ausführung kontinuierlich Speicher, gibt den Speicher jedoch erst am Ende frei. Streng genommen liegt hier kein Speicherverlust vor, da das Programm schlie?lich den gesamten angeforderten Speicher freigibt. Aber bei einem Serverprogramm, das tage-, wochen- oder sogar monatelang laufen muss, kann es auch dazu führen, dass der gesamte Systemspeicher ersch?pft ist, wenn der Speicher nicht rechtzeitig freigegeben wird. Daher bezeichnen wir diese Art von Speicherverlust als impliziten Speicherverlust.
5. Ursachen und L?sungen für einen Speicherüberlauf:
(1) Ursachen für einen Speicherüberlauf:
-
Die in den Speicher geladene Datenmenge ist zu gro?, z. B. weil zu viele Daten entnommen werden
Es gibt Verweise auf Objekte in der Sammlungsklasse, die nach der Verwendung nicht gel?scht werden, sodass die JVM sie nicht recyceln kann.
Der Code enth?lt eine Endlosschleife oder die Schleife generiert zu viele doppelte Objekteinheiten;
Der erste Schritt besteht darin, die JVM-Startparameter zu ?ndern und den Speicher direkt zu erh?hen. (Vergessen Sie nicht, die Parameter -Xms und -Xmx hinzuzufügen.) Der zweite Schritt besteht darin, das Fehlerprotokoll zu überprüfen, um zu sehen, ob vor dem ?OutOfMemory“-Fehler andere Ausnahmen oder Fehler vorliegen.
Der dritte Schritt besteht darin, den Code durchzugehen und zu analysieren, um herauszufinden, wo ein Speicherüberlauf auftreten kann. -
Konzentrieren Sie sich auf folgende Punkte:
überprüfen Sie, ob in der Datenbankabfrage eine Abfrage vorhanden ist, um alle Daten auf einmal abzurufen. Wenn hunderttausend Datens?tze gleichzeitig in den Speicher abgerufen werden, kann es im Allgemeinen zu einem Speicherüberlauf kommen. Dieses Problem ist relativ versteckt, da weniger Daten in der Datenbank vorhanden waren und es weniger wahrscheinlich zu Problemen kam. Nach dem Online-Gehen waren mehr Daten in der Datenbank vorhanden, und eine einzelne Abfrage konnte zu einem Speicherüberlauf führen. Versuchen Sie daher, Paging für Datenbankabfragen zu verwenden.
überprüfen Sie, ob der Code Endlosschleifen oder rekursive Aufrufe enth?lt.
überprüfen Sie, ob es eine gro?e Schleife gibt, die immer wieder neue Objektentit?ten generiert.
überprüfen Sie, ob in der Datenbankabfrage eine Abfrage vorhanden ist, um alle Daten auf einmal abzurufen. Wenn hunderttausend Datens?tze gleichzeitig in den Speicher abgerufen werden, kann es im Allgemeinen zu einem Speicherüberlauf kommen. Dieses Problem ist relativ versteckt, da weniger Daten in der Datenbank vorhanden waren und es weniger wahrscheinlich zu Problemen kam. Nach dem Online-Gehen waren mehr Daten in der Datenbank vorhanden, und eine einzelne Abfrage konnte zu einem Speicherüberlauf führen. Versuchen Sie daher, Paging für Datenbankabfragen zu verwenden.
überprüfen Sie, ob Sammlungsobjekte wie List und MAP nach der Verwendung nicht gel?scht werden. Sammlungsobjekte wie List und MAP verfügen immer über Verweise auf die Objekte, sodass diese Objekte von GC nicht recycelt werden k?nnen.
Im vierten Schritt verwenden Sie das Speicheranzeigetool, um die Speichernutzung dynamisch anzuzeigen.
JVM8-Speichermodell ) l?dt die Bytecode-Datei der erforderlichen Klasse. Nach dem Laden wird es zur Ausführung an die Ausführungs-Engine übergeben. W?hrend des Ausführungsprozesses wird eine gewisse Zeitspanne zum Speichern der Daten ben?tigt (analog zur CPU und zum Hauptspeicher). Der Zuweisungs- und Freigabeprozess dieses Speicherplatzes ist der Laufzeitdatenbereich, um den wir uns kümmern müssen. Beim Laden des Klassenladers tritt ein Speicherüberlauf auf, der in zwei Kategorien unterteilt ist: OutOfMemoryError und StackOverflowError. Im Folgenden werden 10 Speicherüberlaufsituationen aufgeführt und anhand von Beispielcode erl?utert, wie ein Speicherüberlauf auftritt.
1.Java-Heap-Speicherüberlauf
Wenn die Ausnahme java.lang.OutOfMemoryError:Java-Heap-Speicherplatz auftritt, handelt es sich um einen Heap-Speicherüberlauf.
1), ProblembeschreibungDer JVM-Speichersatz ist zu klein, der für das Objekt erforderliche Speicher ist zu gro? und diese Ausnahme wird ausgel?st, wenn beim Erstellen des Objekts Speicherplatz zugewiesen wird.
Verkehrs-/Datenspitzen, es gibt bestimmte Grenzen für die eigene Verarbeitung der Anwendung, wie zum Beispiel eine bestimmte Anzahl von Benutzern oder eine bestimmte Datenmenge. Wenn die Anzahl der Benutzer oder die Datenmenge pl?tzlich ansteigt und den erwarteten Schwellenwert überschreitet, werden die Vorg?nge, die vor dem Spitzenwert normal ausgeführt wurden, gestoppt und Java lang.OutOfMemoryError: Java-Heap-Space-Fehler
2) ausgel?st. Beispielcode
- Kompilieren Sie den folgenden Code und setzen Sie die JVM-Parameter bei der Ausführung auf -Xms20m -Xmx20m
- Wenn im obigen Beispiel eine Anforderung nur einmal 5 m Speicher zuweist, ist die Anforderungsmenge sehr gering und Müll Die Sammlung erfolgt normal und es treten keine Fehler auf. Sobald sie jedoch gleichzeitig ausgeführt wird, wird der maximale Speicherwert überschritten und ein Speicherüberlauf wird ausgel?st. 3. L?sung
2. Java-Heap-Speicherverlust
1), Problembeschreibung
Speicherverluste in Java sind Situationen, in denen einige Objekte von der Anwendung nicht mehr verwendet werden, aber von der Garbage Collection nicht erkannt werden. Daher sind diese nicht verwendeten Objekte weiterhin auf unbestimmte Zeit im Java-Heap-Speicher vorhanden. Die st?ndige Akkumulation l?st schlie?lich java.lang.OutOfMemoryError aus.
2), Beispielcode
Wenn man den obigen Code ausführt, k?nnte man erwarten, dass er ewig ohne Probleme l?uft, vorausgesetzt, dass die reine Caching-L?sung die zugrunde liegende Karte nur auf 10.000 Elemente erweitert, nicht alle Schlüssel sind bereits alle in der HashMap. Tats?chlich werden jedoch weiterhin Elemente hinzugefügt, da die Schlüsselklasse ihre Methode equal() nicht überschreibt. Da der durchgesickerte Code mit der Zeit st?ndig verwendet wird, verbrauchen die ?zwischengespeicherten“ Ergebnisse letztendlich viel Java-Heap-Speicherplatz. Wenn verlorener Speicher den gesamten verfügbaren Speicher im Heap-Bereich füllt, kann die Speicherbereinigung ihn nicht bereinigen, java.lang.OutOfMemoryError.
3), L?sungDie entsprechende L?sung ist relativ einfach: Schreiben Sie einfach die Equals-Methode neu:
3. Garbage Collection Timeout-Speicherüberlauf
1), Problembeschreibung: Wenn die Anwendung den gesamten verfügbaren Speicher ersch?pft, wird das GC-Overhead-Limit überschritten Wenn der Fehler aufgetreten ist und der GC ihn mehrmals nicht l?schen konnte, wird ein java.lang.OutOfMemoryError ausgel?st. Wenn die JVM viel Zeit mit der Ausführung von GC verbringt, ohne dass dies Auswirkungen hat, und sobald der gesamte GC-Prozess das Limit überschreitet, wird ein Fehler ausgel?st (die standardm??ige GC-Zeit der JVM-Konfiguration überschreitet 98 % und der recycelte Heap-Speicher betr?gt weniger als 2). %).
2), Beispielcode
3), L?sung
Um den Objektlebenszyklus zu verkürzen, versuchen Sie, die Speicherbereinigung so schnell wie m?glich durchzuführen.
4. Metaspace-Speicherüberlauf
1), Problembeschreibung
überlauf des Metaspace, das System l?st java.lang.OutOfMemoryError: Metaspace aus. Der Grund für dieses ungew?hnliche Problem liegt darin, dass das System über viel Code verfügt oder auf viele Pakete von Drittanbietern verweist oder dass dynamische Codegenerierung und Klassenladen verwendet werden, was zu einem gro?en Speicherbedarf im Metaspace führt.
2), Beispielcode
3), L?sung
Standardm??ig ist die Gr??e des Metaspace nur durch den lokalen Speicher begrenzt. Im Interesse der Leistung der gesamten Maschine sollte dieses Element jedoch so weit wie m?glich eingestellt werden, um eine Unterbrechung des Betriebs der gesamten Maschine zu vermeiden.
Parameterkonfiguration optimieren, um Auswirkungen auf andere JVM-Prozesse zu vermeiden
-XX: MetaspaceSize, anf?ngliche Speicherplatzgr??e, wird die Speicherbereinigung zum Entladen des Typs ausgel?st und der GC passt den Wert an: wenn freigegeben Wenn viel Speicherplatz vorhanden ist, verringern Sie den Wert entsprechend. Wenn nur wenig Speicherplatz freigegeben wird, erh?hen Sie den Wert entsprechend, wenn er MaxMetaspaceSize nicht überschreitet.
-XX:MaxMetaspaceSize, der maximale Speicherplatz, standardm??ig gibt es keine Begrenzung.
Zus?tzlich zu den beiden oben genannten Optionen zur Gr??enangabe gibt es zwei GC-bezogene Attribute: -XX:MinMetaspaceFreeRatio. Nach GC wird der Prozentsatz der minimalen verbleibenden Metaspace-Speicherkapazit?t auf die durch den zugewiesenen Speicherplatz verursachte Speicherbereinigung reduziert. -XX: MaxMetaspaceFreeRatio, nach GC der Prozentsatz der maximalen verbleibenden Metaspace-Speicherkapazit?t, reduziert auf die durch die Freigabe von Speicherplatz verursachte Speicherbereinigung.
Vorsicht bei der Angabe von Drittanbieterpaketen
W?hlen Sie Drittanbieterpakete sorgf?ltig aus und entfernen Sie unn?tige Pakete. Dies wird nicht nur dazu beitragen, die Geschwindigkeit der Kompilierung und Verpackung zu verbessern, sondern auch die Geschwindigkeit der Remote-Bereitstellung zu verbessern.
Achten Sie auf Frameworks, die dynamisch generierte Klassen verwenden.
Bei Frameworks, die eine gro?e Anzahl dynamisch generierter Klassen verwenden, sollten Stresstests durchgeführt werden, um zu überprüfen, ob die dynamisch generierten Klassen den Speicherbedarf überschreiten und eine Ausnahme ausgel?st wird .
5. Direkter Speicherüberlauf
1), Problembeschreibung
Es wird verwendet, wenn allocateDirect() in ByteBuffer verwendet wird. Viele JavaNIO-Frameworks (wie Netty) sind als andere Methoden gekapselt, ein java.lang. OutOfMemoryError: Wenn dieses Problem auftritt, wird eine Ausnahme für den direkten Pufferspeicher ausgel?st.
?hnliche Probleme treten auf, wenn Sie direkt oder indirekt die allocateDirect-Methode in ByteBuffer verwenden, ohne sie zu l?schen.
2), Beispielcode
3), L?sung
Wenn Sie h?ufig ?hnliche Vorg?nge haben, k?nnen Sie die Parameter -XX:MaxDirectMemorySize festlegen und den Speicher rechtzeitig l?schen.
6. Stapelspeicherüberlauf
1), Problembeschreibung
Wenn ein Thread eine Java-Methode ausführt, erstellt die JVM einen neuen Stapelrahmen und schiebt ihn an die Spitze des Stapels. Zu diesem Zeitpunkt wird der neue Stapelrahmen zum aktuellen Stapelrahmen. Wenn die Methode ausgeführt wird, wird der Stapelrahmen zum Speichern von Parametern, lokalen Variablen, Zwischenanweisungen und anderen Daten verwendet.
Wenn sich eine Methode rekursiv aufruft, werden die von der neuen Methode generierten Daten (die auch als neuer Stapelrahmen verstanden werden k?nnen) an den Anfang des Stapels verschoben. Jedes Mal, wenn die Methode sich selbst aufruft, werden die Daten kopiert der aktuellen Methode und schieben Sie sie auf den Stapel. Daher erfordert jede Rekursionsebene die Erstellung eines neuen Stapelrahmens. Das Ergebnis ist, dass bei rekursiven Aufrufen immer mehr Speicher im Stapel verbraucht wird. Wenn sich rekursive Aufrufe millionenfach wiederholen, werden eine Million Stapelrahmen generiert. Dies führt zu einem Stapelspeicherüberlauf.
2), Beispielcode
3), L?sung
Wenn es tats?chlich rekursive Aufrufe im Programm gibt und ein Stapelüberlauf auftritt, k?nnen Sie die Gr??e -Xss erh?hen, um das Problem des Stapelspeicherüberlaufs zu l?sen. Rekursive Aufrufe verhindern die Bildung einer Endlosschleife, da es sonst zu einem Stapelspeicherüberlauf kommt.
7. Speicherüberlauf beim Erstellen eines lokalen Threads
1), Problembeschreibung
Der Thread belegt im Grunde nur den Speicherbereich au?er dem Heap Heap: Dem Thread kann kein Speicherbereich zugewiesen werden. Dies liegt entweder daran, dass der Speicher selbst nicht ausreicht, oder der Heap-Speicherplatz ist zu gro?, was dazu führt, dass nicht mehr viel Speicher übrig bleibt, und weil der Thread selbst Speicher belegt ist nicht genug.
2), Beispielcode
3), L?sung
überprüfen Sie zun?chst, ob die Anzahl der Threads mit der Shell begrenzt ist. Wenn dies das Problem ist, müssen Sie dies tun Passen Sie die maximal unterstützte Anzahl des Systems an.
Versuchen Sie bei der t?glichen Entwicklung sicherzustellen, dass die maximale Anzahl von Threads kontrollierbar ist, und verwenden Sie den Thread-Pool nicht willkürlich. Es kann nicht unbegrenzt wachsen.
8. Speicherüberlauf über den Swap-Bereich hinaus
1), Problembeschreibung
W?hrend des Startvorgangs von Java-Anwendungen k?nnen Sie den angegebenen erforderlichen Speicher durch -Xmx und andere ?hnliche Startparameter begrenzen. Wenn der von der JVM angeforderte Gesamtspeicher gr??er ist als der verfügbare physische Speicher, beginnt das Betriebssystem mit der Konvertierung des Inhalts vom Speicher auf die Festplatte.
Im Allgemeinen gibt die JVM den Fehler ?Nicht genügend Swap-Speicherplatz“ aus. Dies bedeutet, dass die Fehlermeldung die Gr??e des nativen Heaps enth?lt, wenn die Anwendung den nativen JVM-Heap nicht zum Zuweisen von Speicher anfordert und der native Heap bald ersch?pft ist Zuordnungsfehler (in Bytes) und der Grund, warum die Anfrage fehlgeschlagen ist.
2) L?sung
Erh?hen Sie die Gr??e des System-Swap-Bereichs, wenn der Swap-Bereich verwendet wird. Diese Methode wird in der Produktionsumgebung nicht empfohlen Speicher, der den physischen Speicher des Systems überschreitet. Zweitens entfernen Sie den System-Swap-Bereich und verwenden Sie den Systemspeicher nur, um die Anwendungsleistung sicherzustellen.
9. Array-überlauf: Speicherüberlauf: Manchmal wird die angeforderte Array-Gr??e überschritten ist eine Grenze für die maximale Gr??e, die je nach Plattform variiert, normalerweise aber zwischen 1 und 2,1 Milliarden Elementen liegt. Wenn der Fehler ?Angeforderte Array-Gr??e überschreitet VM-Grenze“ auftritt, bedeutet dies, dass die Anwendung versucht, ein Array zuzuweisen, das gr??er ist, als die Java Virtual Machine unterstützen kann. Bevor die JVM einem Array Speicher zuweist, führt sie eine plattformspezifische Prüfung durch: ob die zugewiesene Datenstruktur auf dieser Plattform adressierbar ist. 2), Beispielcode
Das Folgende ist der Code. Das Array überschreitet die maximale Grenze.
3), L?sung
Daher muss die Array-L?nge innerhalb des von der Plattform zugelassenen L?ngenbereichs liegen. Allerdings ist dieser Fehler im Allgemeinen selten, haupts?chlich weil der Index eines Java-Arrays vom Typ int ist. Die gr??te positive ganze Zahl in Java ist 2^31 - 1 = 2.147.483.647. Und plattformspezifische Grenzwerte k?nnen dieser Zahl sehr nahe kommen, zum Beispiel: In meiner Umgebung (64-Bit-MacOS, mit Jdk1.8) kann ich Arrays mit L?ngen von bis zu 2.147.483.645 (Integer.MAX_VALUE-2) initialisieren. Wenn die L?nge des Arrays um 1 erh?ht wird, um nteger.MAX_VALUE-1 zu erreichen, tritt ein OutOfMemoryError auf.
10. System t?tet Prozessspeicherüberlauf ab
1) Problemübersicht Bevor wir dieses Problem beschreiben, machen wir uns mit einigen Betriebssystemkenntnissen vertraut: Das Betriebssystem basiert auf dem Konzept von Prozessen, und diese Prozesse sind in der Kernel Im Betrieb gibt es einen ganz besonderen Prozess namens ?Out of Memory Killer“. Wenn der Kernel feststellt, dass das System nicht über genügend Speicher verfügt, wird der OOM-Killer aktiviert, prüft, welcher Prozess derzeit den meisten Speicher belegt, und beendet dann den Prozess. Im Allgemeinen wird der Fehler ?Nicht genügend Arbeitsspeicher: Prozess beenden oder untergeordnetes Element opfern“ ausgel?st, wenn der verfügbare virtuelle virtuelle Speicher (einschlie?lich Auslagerungsspeicher) so weit verbraucht ist, dass das gesamte Betriebssystem gef?hrdet ist. In diesem Fall w?hlt OOM Killer den ?Rogue-Prozess“ aus und beendet ihn.
2) Beispielcode Wenn genügend Speicher vorhanden ist, tritt dieses Problem nicht auf. Zusammenfassend l?sst sich sagen, dass durch die oben genannten 10 Arten von Speicherüberlaufsituationen jeder wei?, wie er das Problem l?sen kann, wenn er tats?chlich darauf st??t. Beim tats?chlichen Codieren sollten Sie auch Folgendes beachten: JAR-Pakete von Drittanbietern sollten eingeführt werden Sorgf?ltig und entschlossen entfernt. Nutzlose JAR-Pakete, um die Kompilierungsgeschwindigkeit und die Systemspeichernutzung zu verbessern.Bei gro?en Objekten oder Anwendungen mit gro?em Speicher muss eine Optimierung durchgeführt werden, um die Verarbeitungsleistung zu verbessern und den Objektlebenszyklus zu verkürzen.
Versuchen Sie, die Anzahl der Threads festzulegen, um sicherzustellen, dass der von Threads belegte Speicher kontrollierbar ist. Wenn eine gro?e Anzahl von Threads ben?tigt wird, muss die maximale Anzahl offener Verbindungen des Betriebssystems optimiert werden. Bei rekursiven Aufrufen muss auch der Grad der Rekursion kontrolliert werden, er darf nicht zu hoch sein und die Tiefe des Stapels überschreiten.
Je gr??er der dem Stapel zugewiesene Speicher ist, desto besser, denn je gr??er der Stapelspeicher und je mehr Threads, desto mehr Platz bleibt nicht mehr für den Heap übrig und es ist einfach, OOM auszul?sen. Im Allgemeinen gibt es kein Problem mit den Standardparametern der JVM (einschlie?lich Rekursion).
Empfohlene verwandte Video-Tutorials: Java-Video-Tutorial
Das obige ist der detaillierte Inhalt vonWas sind Speicherlecks und Speicherüberl?ufe in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Um JDBC -Transaktionen korrekt zu verarbeiten, müssen Sie zun?chst den automatischen Komiti -Modus ausschalten und dann mehrere Vorg?nge ausführen und schlie?lich entsprechend den Ergebnissen festlegen oder rollen. 1. Nennen Sie Conn.SetAutoCommit (False), um die Transaktion zu starten. 2. Führen Sie mehrere SQL -Operationen aus, z. B. einfügen und aktualisieren. 3. Rufen Sie Conn.Commit () an, wenn alle Vorg?nge erfolgreich sind, und rufen Sie Conn.Rollback () auf, wenn eine Ausnahme auftritt, um die Datenkonsistenz zu gew?hrleisten. Gleichzeitig sollten Try-with-Ressourcen verwendet werden, um Ressourcen zu verwalten, Ausnahmen ordnungsgem?? zu behandeln und Verbindungen zu schlie?en, um Verbindungsleckage zu vermeiden. Darüber hinaus wird empfohlen, Verbindungspools zu verwenden und Save -Punkte zu setzen, um teilweise Rollback zu erreichen und Transaktionen so kurz wie m?glich zu halten, um die Leistung zu verbessern.

Verwenden Sie Klassen im Java.Time -Paket, um das alte Datum und die Kalenderklassen zu ersetzen. 2. Erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit durch LocalDate, LocalDatetime und Local Time; 3. Erstellen Sie ein bestimmtes Datum und eine bestimmte Uhrzeit mit der von () Methode; 4.. Verwenden Sie die Plus/Minus -Methode, um die Zeit nicht zu erh?hen und zu verkürzen. 5. Verwenden Sie ZonedDatetime und zoneId, um die Zeitzone zu verarbeiten. 6. Format und analysieren Sie Datumszeichenfolgen über DateTimeFormatter; 7. Verwenden Sie sofortige, um bei Bedarf mit den alten Datumstypen kompatibel zu sein. Die Verarbeitung der Datum in der modernen Java sollte der Verwendung von Java.Timeapi vorrangig machen, was klare, unver?nderliche und linear ist

Pre-Formancetartuptimemoryusage, QuarkusandmicronautleadduToCompile-Time-foringandgraalvSupport, WithQuarkusofttenperformLightBetterin serverloser Szenarien.2. Thyvelopecosystem,

Die Müllsammlung von Java (GC) ist ein Mechanismus, der automatisch den Speicher verwaltet, der das Risiko eines Speicherlecks verringert, indem unerreichbare Objekte zurückgeführt werden. 1.GC beurteilt die Zug?nglichkeit des Objekts aus dem Stammobjekt (z. B. Stapelvariablen, aktive Threads, statische Felder usw.) und nicht erreichbare Objekte als Müll markiert. 2. Basierend auf dem markierten Algorithmus markieren Sie alle erreichbaren Objekte und l?schen Sie nicht markierte Objekte. 3.. Verfolgen Sie eine Generationskollektionsstrategie: Die neue Generation (Eden, S0, S1) führt h?ufig MollGC aus; Die ?lteren Menschen erzielen weniger, dauert jedoch l?nger, um MajorGC durchzuführen. MetaPace speichert Klassenmetadaten. 4. JVM bietet eine Vielzahl von GC -Ger?ten: SerialGC ist für kleine Anwendungen geeignet; ParallelgC verbessert den Durchsatz; CMS reduziert sich

HTTP-Protokoll Middleware in Go kann Anforderungsmethoden, Pfade, Client-IP und zeitaufw?ndiges Aufzeichnen aufzeichnen. 1. Verwenden Sie http.Handlerfunc, um den Prozessor zu wickeln, 2. Nehmen Sie die Startzeit und die Endzeit vor und nach dem Aufrufen als n?chstes auf. Der vollst?ndige Beispielcode wurde überprüft, um auszuführen und eignet sich zum Starten eines kleinen und mittelgro?en Projekts. Zu den Erweiterungsvorschl?gen geh?ren das Erfassen von Statuscodes, die Unterstützung von JSON -Protokollen und die Nachverfolgung von ID -IDs.

Durch die Auswahl des richtigen HTMlinput -Typs kann die Datengenauigkeit verbessert, die Benutzererfahrung verbessert und die Benutzerfreundlichkeit verbessert werden. 1. W?hlen Sie die entsprechenden Eingabetypen gem?? dem Datentyp aus, z. B. Text, E -Mail, Tel, Nummer und Datum, die automatisch überprüft und an die Tastatur anpassen k?nnen. 2. Verwenden Sie HTML5, um neue Typen wie URL, Farbe, Reichweite und Suche hinzuzufügen, die eine intuitivere Interaktionsmethode bieten k?nnen. 3.. Verwenden Sie Platzhalter und erforderliche Attribute, um die Effizienz und Genauigkeit der Formulierung zu verbessern. Es sollte jedoch beachtet werden, dass der Platzhalter das Etikett nicht ersetzen kann.

GradleStheBetterChoiceFormostnewProjectsDuetoitSuperiorFlexibilit?t, Leistung und ModerntoolingSupport.1.GRADLE'SGROOVY/KOTLINDSLISMORECONCISEANDEIPRESSIVETHANMANMANBOSEXML.2.GRAGRECONCISEANDEPRPRESSIVETHANMAVENSVOSEXML.2.

Auf Defer wird verwendet, um bestimmte Vorg?nge auszuführen, bevor die Funktion zurückgibt, z. B. die Reinigungsressourcen. Die Parameter werden sofort bewertet, wenn sie aufgeschoben werden, und die Funktionen werden in der Reihenfolge von Last-In-First-Out (LIFO) ausgeführt. 1. Mehrere Defers werden in umgekehrter Reihenfolge der Erkl?rungen ausgeführt. 2. h?ufig für die sichere Reinigung wie das Schlie?en von Dateien verwendet; 3. Der benannte Rückgabewert kann ge?ndert werden; V. 5. Vermeiden Sie den Missbrauch von Verschiebungen in Schleifen, um Ressourcenleckage zu verhindern. Die korrekte Verwendung kann die Sicherheit und die Lesbarkeit der Code verbessern.
