Benötigen Sie eine speicherbewusste Implementierung von Java?

Einführung

Ein Memorandum von dem, was ich gelernt habe, weil ich mich über meine Gedanken zur Erinnerung beraten habe. Was die Begriffe betrifft, schreibe ich die Teile, die ich so kenne, wie sie sind. Im Gegenteil, wenn es falsch verwendet zu werden scheint, weisen Sie bitte darauf hin (und lassen Sie es mich wissen).

Kenntnis der Speichernutzung

Informationen zum Laden von Klassen

Bei der Hauptausführung (oder wenn eine Klasse, die eine Hauptfunktion hat, bevor sie von jvm interpretiert wird), Laden Sie die zugehörige Klasse wurmartig in den Speicher.

(Frage) Laden von Klassen, Instanziieren usw. Muss ich mir dessen so bewusst sein?

(Es kann getroffen werden, je nachdem, wie Sie darüber denken.) ** Sie müssen sich dessen nicht bewusst sein. Da die Sprache Java eine Sprache ist, müssen Implementierer die Speicherverwaltung (insofern) nicht kennen. Dieser Bereich ist auf Wikipedia geschrieben. [Java # Garage Collection-Wikipedia](https://ja.wikipedia.org/wiki/Java#%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3% 82% B3% E3% 83% AC% E3% 82% AF% E3% 82% B7% E3% 83% A7% E3% 83% B3)

Wenn Sie sich der Speicherverwaltung bewusst sind, werden Sie über die Implementierung einer JVM sprechen. (Wenn Sie es vollständig verwalten möchten, sollten Sie zuerst C oder C ++ verwenden?)

Sogar die Endprogrammierer sollten sich des Speichers bewusst sein

Verwenden Sie statische Felder (statische Variablen) nicht mehr als nötig.

Sie sollten sich der rechten Seite des statischen Feldes bewusst sein. Das statische Feld wird beim Laden der Klasse erstellt. Wenn eine starke Verarbeitung auf die rechte Seite gestellt wird (Initialisierung), verursacht dies Speicherdruck. Instanzvariablen, statische Initialisierer und Initialisierer sollten ebenfalls berücksichtigt werden.

Beachten Sie, dass die Instanziierung (neu) kostspielig ist.

Bei der Instanzerstellung wird ein Heap zugewiesen und ein Objekt erstellt. (Ausführung von Instanzvariablen, Instanzmethoden, Initialisierern) Offensichtlich kostet es jedes Mal Geld, wenn es generiert wird.

(Wird für das Umschreiben in Betracht gezogen) ~~ Statische Methoden gut machen ~~

Wenn es keine Nebenwirkungen gibt, ist statische Aufladung besser, da die Erzeugung nicht viel kostet. Der hier erwähnte Nebeneffekt ist, ob es unabhängig vom Status der Instanz erstellt werden kann. Ich verstehe, dass die sogenannte Util-Klasse positiv genutzt werden kann. (Da die Klasse geladen wird, wenn die Hauptmethode ausgeführt wird, sind keine Generierungskosten erforderlich.)

public static int plus(int a, int b){
    retrun a + b;
}
Sei dir unveränderlich bewusst

Es gibt eine unveränderliche Kontroverse.

Was ist unveränderlich? Unveränderliche (unveränderliche) und veränderbare (veränderbare) Objekte.

Typische Beispiele in Java sind "String", "LocalDateTime" usw. Es scheint, dass Affirmative und Negative heiße Diskussionen über diesen Tag und diese Nacht führen.

** Bejahend: ** Wenn die Werte nicht aktualisiert werden, ist das Programm sicher. Auch wenn Sie eine neue Instanz erstellen, sollte die ursprüngliche Instanz nicht erforderlich sein, sodass sie von GC entsprechend kopiert wird.

** Negativ: ** Verschwenderische Erstellungskosten der Instanz. (Überlegt neu zu schreiben) ~~ Gefahr eines Speicherverlusts. ~~

Als Entwickler wäre es schön, denselben Wert so implementieren zu können, dass er dieselbe Referenz wie String enthält, aber es wäre schwierig, ihn so stark in die Logik zu integrieren. Ich denke, es ist besser, sich der Unveränderlichkeit bewusst zu sein.

Wie man es in Zukunft umsetzt

Auch wenn Sie nicht zu viel darüber nachdenken, können Sie es so implementieren, dass kein Speicher wie zuvor verloren geht. Zum Beispiel das Folgende.

Grundsätzlich bleibt die Speicherverwaltung Java überlassen, solange Java verwendet wird.

(Bonus) Über GC

Es gibt Copy GC und Full GC. Sie können ein GC-Protokoll erhalten. (Vm Option)

Weiter beiseite

Mir wurde das GC-Protokoll des Systems angezeigt, das ich entwickle. Im Protokoll trat fullGC zu Beginn des Starts mehrmals auf. (In der Vergangenheit wurde der Speicher anscheinend zur Laufzeit angegeben, aber aus irgendeinem Grund scheint er jetzt angehalten zu haben. Dies kann daran liegen, dass es sich um eine Testumgebung handelt.) Wenn ich die niedrigste zu verwendende Zeile kenne, dachte ich, ich sollte die vm-Option "-Xms" angeben, um zu verhindern, dass fullGC auftritt.

Ich würde gerne wieder GC studieren.

abschließend

Ich hatte mir ungefähr zwei Wochen lang Sorgen darüber gemacht, aber ich habe mich einmal dem Java-Speicher angenähert. Ich suchte im Internet nach Informationen und fragte verschiedene Leute, aber es kam mir nicht in den Sinn, also brauchte ich eine Weile, um zu verstehen. Ich bin den Führungskräften vor Ort sehr dankbar für ihre höflichen Erklärungen, während ich beschäftigt war.

Artikel Link

@ j5c8k6m8 habe diesen Artikel gelesen und ein Gedicht geschrieben, also habe ich einen Link gepostet. Qiita - Benötigen Sie speicherbewusste Programmierung (Implementierung) Ich habe es gelesen, aber es war eine Lernerfahrung.

Referenz

So überprüfen Sie Qiita --OutOfMemoryError

Recommended Posts

Benötigen Sie eine speicherbewusste Implementierung von Java?
[Java] Implementierung des Faistel-Netzwerks
Java-Implementierung von Tri-Tree
Benötigen Sie diese Vorspannung wirklich? ~ Nutzung der verzögerten Last ~
Implementierung eines mathematischen Syntaxanalysators durch rekursive absteigende Syntaxanalysemethode (Java)
Denken Sie an eine Java-Update-Strategie
Warum brauchen Sie Bundle Exec
Liste der Java-Objekte sortieren
Kannst du es machen? Java EE
Eine kurze Beschreibung der JAVA-Abhängigkeiten
Implementierung einer ähnlichen Funktion in Java
Verwenden Sie Stream in Java?
Lassen Sie uns eine TODO-App in Java 4 erstellen. Implementierung der Buchungsfunktion
Lassen Sie uns eine TODO-App in Java 6 erstellen. Implementierung der Suchfunktion
Lassen Sie uns eine TODO-App in Java 8 erstellen. Implementierung von Bearbeitungsfunktionen
Nennen Sie eine Gruppe regulärer Ausdrücke (Java)
Eine Geschichte, die die Implementierung der SendGrid-Java-Bibliothek bestätigt, wenn die E-Mail-Zustellung fehlschlägt
Verwenden Sie doch die for-Anweisung? Verwenden Sie die while-Anweisung? Ordnungsgemäße Verwendung von for-Anweisung und while-Anweisung
Messen Sie die Größe eines Ordners mit Java
Ein Hinweis, wenn Sie Tupel in Java möchten
[JQuery] Implementierungsverfahren der AutoComplete-Funktion [Java / Spring]
Eine Sammlung einfacher Fragen für Java-Anfänger
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Implementierung der Löschfunktion (wenn Sie einen fremden Schlüssel haben)
Was tun, wenn in bind.pry eine falsche Anzahl von Argumenten angezeigt wird?
Was tun, wenn beim Versuch, Eclipse unter Java 9 auszuführen, ein NoClassDefFoundError angezeigt wird?
[Java] Übersicht über Java
[Read Effective Java] Kapitel 3 Punkt 12 "Berücksichtigung der Implementierung von Comparable"
Rufen Sie eine Liste mit MBean-Informationen für Java-Anwendungen ab
Ein kurzer Überblick über Java, das in Klasse 4 gelernt wurde
Implementierungsbeispiel eines einfachen LISP-Verarbeitungssystems (Java-Version)
Was tun, wenn Sie versehentlich ein Modell erstellen?
Awesome Java: Großartige Java Framework Library-Software
Erfahrung mit dem Bestehen von Java Silver als neuer Absolvent
Lass uns einen Roboter bauen! "Eine einfache Demo von Java AWT Robot"
[Java] Beim Schreiben der Quelle ... Memorandum ①
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 2 gelernt wurde
Eine Übersicht über das native Java-Framework Quarkus von Kubernetes
Was benötigen Sie am Ende, um eine Web-App mit Java zu erstellen? Erklären Sie den Mechanismus und was zum Lernen notwendig ist