JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 94. Überprüfung von fünf statischen Java-...

Kaffeepause Nr. 94. Überprüfung von fünf statischen Java-Code-Analysatoren. Java-Heap- und Stack-Speicherfehler

Veröffentlicht in der Gruppe Random-DE

Überprüfung von fünf statischen Java-Code-Analysatoren

Quelle: DZone Entwickler benötigen häufig verschiedene Programme, einschließlich statischer Code-Analysatoren, die fehlerhaften Code schon früh in der Entwicklung finden und beheben können. Während Codeüberprüfungen bei diesem Unterfangen ein unschätzbar wertvolles Werkzeug sind, ist die Menge an Codeüberprüfern, die sie überprüfen und überprüfen müssen, manchmal entmutigend. Das erfordert viel Zeit und Mühe. Dies führt auch dazu, dass Prüfer oft nur auf Codefragmente achten, die für den Betrieb des Programms kritisch sind. Statische Analysetools prüfen hingegen den gesamten Code mit der gleichen Genauigkeit. Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java-Heap- und Stack-Speicherfehler – 1Ich habe mehrere Code-Analysatoren zusammengestellt, die mit IntelliJ IDEA kompatibel sind. Ich hoffe, das hilft Ihnen bei Ihrer Arbeit.

Integrierter IntelliJ IDEA-Analysator

Der in IntelliJ IDEA integrierte statische Java-Code-Analysator steht spezialisierten statischen Analysetools in nichts nach. Die Suche nach verdächtigen, überladenen oder fehlerhaften Codefragmenten erfolgt mithilfe verschiedener statischer Analysemethoden: Datenflussanalyse und Mustervergleich. IntelliJ IDEA verfügt über eine große Anzahl von Inspektionen. Tatsächlich melden viele von ihnen den Fehler nicht immer genau. Sie deuten vielmehr auf eine Schlamperei im Code oder die Möglichkeit hin, ihn durch eine nette Alternative zu ändern. Nachdem ich mich ein wenig mit „Inspektionen → Java“ beschäftigt hatte, fiel mir eines auf. Bei Inspektionen in den Kategorien wahrscheinliche Fehler, numerische Probleme und Serialisierungsprobleme ist es wahrscheinlicher, dass echte Fehler gefunden werden. In jedem Fall müssen Sie die Tests selbst durchführen und feststellen, welche für Ihr Projekt nützlich sind. Da die statische Analyse im Codebearbeitungsmodus durchgeführt wird, können Sie in IntelliJ IDEA Fehler innerhalb von Sekunden nach ihrem Auftreten beheben. Der Editor markiert sofort das fehlerhafte Codefragment. Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java Heap- und Stack-Speicherfehler – 2Es ist wirklich praktisch und cool! Wenn Sie außerdem die Kombination „Alt + Enter“ für einen ausgewählten Codeabschnitt verwenden, können Sie über das Kontextmenü eine der Optionen zur Behebung des Fehlers auswählen: Sie können auch den Grund für die Ausführung einer bestimmten Inspektion herausfinden Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java Heap- und Stack-Speicherfehler – 3. In manchen Fällen verkürzt sich dadurch die Suchzeit: Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java Heap- und Stack-Speicherfehler – 4Sie können die Analyse manuell durchführen, indem Sie „Analysieren → Code prüfen“ wählen. Oder Sie führen eine Einzelprüfung über „Analysieren → Prüfung nach Namen ausführen“ durch. Legen Sie vorher den Umfang der Analyse fest (für ein Projekt, ein Modul oder eine einzelne Datei). Wenn Sie eine Analyse auf diese Weise ausführen, werden einige Inspektionen verfügbar, die aufgrund der Komplexität nicht im Bearbeitungsmodus funktionieren. Nach der Analyse werden die Ergebnisse in einem separaten Fenster nach Kategorie/Verzeichnis gruppiert. Von diesem Fenster aus können Sie zu einem bestimmten Validierungsauslöser navigieren: Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java Heap- und Stack-Speicherfehler – 5IntelliJ ermöglicht Ihnen nur das Speichern des Analyseergebnisses in den Formaten HTML und XML. Leider ist es meiner Meinung nach am bequemsten, mit erkannten Problemen in der IDE selbst zu arbeiten. Notiz. Die meisten statischen Analysefunktionen sind in der kostenlosen IntelliJ IDEA Community Edition verfügbar.

SonarJava

SonarJava ist ein statischer Code-Analysator für Java von SonarSource. Die Liste seiner Funktionen umfasst:
  • Über 150 Fehlererkennungsregeln;
  • Über 350 Regeln zum Erkennen von Code-Gerüchen;
  • Über 40 Regeln zur Erkennung potenzieller Schwachstellen ;
  • Integration mit Maven, Gradle, Ant, Eclipse, IntelliJ IDEA, VS Code;
  • Erweiterbar mit benutzerdefinierten Diagnoseregeln;
  • Spezialisiertes SAST-Tool: Die meisten Diagnoseregeln werden gemäß CWE , CERT , OWASP zusammengestellt .
Sie können die Analyse sowohl in verschiedenen IDEs (über das SonarLint -Plugin ) als auch separat in SonarQube ausführen . SonarLint kann Seite an Seite mit dem integrierten IntelliJ IDEA-Codeanalysator arbeiten. Wenn Sie mit der Maus über einen hervorgehobenen Codeabschnitt fahren, werden häufig Warnungen beider Analysetools angezeigt: Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java Heap- und Stack-Speicherfehler – 6Natürlich können Sie die Warnung in einem separaten Fenster anzeigen: Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java Heap- und Stack-Speicherfehler – 7Insgesamt macht die Möglichkeit, SonarJava auf unterschiedliche Weise auszuführen, es attraktiv. Dies gibt Entwicklern die Freiheit, beim Schreiben von Code ein Tool auszuwählen.

FindBugs/SpotBugs

Leider wurde FindBugs schon lange nicht mehr aktualisiert; die letzte stabile Version wurde bereits 2015 veröffentlicht. Aber wir erinnern uns immer noch daran und verwenden es, da es vielleicht der berühmteste kostenlose statische Java-Code-Analysator ist. Wenn Sie einen Java-Entwickler nach statischer Analyse fragen, wird er wahrscheinlich sofort an FindBugs denken. Der Open-Source-Analysator SpotBugs wurde zu einer logischen Fortsetzung des aufgegebenen FindBugs. Es bietet alle Vor- und Nachteile von FindBugs. Die Zeit wird zeigen, ob das gut oder schlecht ist. Mittlerweile wird es von der Analysator-Community aktiv weiterentwickelt. Hauptmerkmale von SpotBugs:
  • Über 400 Fehlererkennungsregeln;
  • Integration in Ant, Maven, Gradle, Eclipse, IntelliJ IDEA;
  • Erweiterbar mit benutzerdefinierten Diagnoseregeln.
Um verdächtigen Code zu finden, werden dieselben Methoden verwendet: Mustervergleich und Datenflussanalyse. Der Analysator erkennt verschiedene Arten von Fehlern, die mit Multithreading, Leistung, Schwachstellen, Code-Verschleierung usw. zusammenhängen. In IntelliJ IDEA sieht das Warnungsfenster wie folgt aus: Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java Heap- und Stack-Speicherfehler – 8Warnungen können nach Kategorie, Klasse, Verzeichnis und Konfidenzniveau gruppiert werden. Sie können gleichzeitig Warnungen und Dokumentation für jede Diagnoseregel anzeigen. Die Analyse wird manuell gestartet. Nach der Analyse werden alle problematischen Codefragmente zusammen mit anderen Warnungen von IntelliJ IDEA und SonarLint hervorgehoben. Es gibt jedoch ein Problem. Sie müssen die Analyse erneut ausführen, um die Warnungen zu aktualisieren und die von Ihnen an der Datei vorgenommenen Änderungen widerzuspiegeln. Es gibt auch viele Hinweiswarnungen, daher muss der Analysator vor der aktiven Nutzung konfiguriert werden.

PVS-Studio

PVS-Studio basiert auf der Open-Source-Bibliothek Spoon. Es verwendet den Quellcode als Eingabe und erstellt ein gut gestaltetes AST-Modell mit semantischen Informationen. Basierend auf diesem Modell verwendet der Analysator moderne Techniken wie:
  • Datenflussanalyse;
  • Symbolische Leistung;
  • Methodenanmerkungen;
  • Musterbasierte Analyse.
Derzeit verwendet der Analysator mehr als 105 Diagnoseregeln, die verschiedene Codefehler identifizieren. Dazu gehören Tippfehlerkorrekturen, das Umbenennen von Nullreferenzen, nicht erreichbarer Code, außerhalb der Grenzen liegende Array-Indizes, Verstöße gegen die Verwendung von Methodenverträgen und andere Fehler. Alle Möglichkeiten der Diagnoseregeln finden Sie hier . Hauptfunktionen von PVS-Studio:
  • Der Analysator konzentriert sich darauf, echte Fehler zu finden;
  • Neben der CLI-Version gibt es auch eine Integration mit IntelliJ IDEA, Maven, Gradle, Jenkins, SonarQube;
  • Möglichkeit, den Analysator im inkrementellen Modus auszuführen;
  • Der Analysator identifiziert potenzielle Kompatibilitätsprobleme mit der Java SE API bei der Migration eines Projekts von Java 8 auf neuere Versionen;
  • PVS-Studio konvertiert den Bericht in verschiedene benutzerfreundliche Formate: JSON, XML, HTML, TXT;
  • Spezialisiertes SAST-Tool: Die meisten Diagnoseregeln werden gemäß CWE , CERT , OWASP zusammengestellt .

PMD

PMD ist ein statischer Open-Source-Analysator. Es identifiziert häufige Entwicklungsfehler: nicht verwendete Variablen, leere Blöcke, Erstellung unnötiger Objekte und andere Probleme. Der Analysator verwendet Quellcode als Eingabe. Derzeit analysiert PMD eine Quelldatei pro Prozess, wodurch die Vollständigkeit der Analyse eingeschränkt wird. Die PMD-Autoren empfehlen, das Projekt vor der Analyse zusammenzustellen. Dadurch können Sie Informationen über die Typen extrahieren, die im analysierten Code verwendet werden. Hauptfunktionen von PMD:
  • Integration mit verschiedenen IDEs (IntelliJ IDEA, Eclipse, NetBeans) und Build-Systemen (Maven, Gradle, Ant);
  • Unterstützt verschiedene Analyseberichtsformate: SARIF, CSV, IDEA, JSON, Text (Standard), XML, HTML, TextColor usw.;
  • Verfügt über mehr als 300 Diagnoseregelvorlagen. Kategorien: Codierungsstil, Best Practices, Fehler, Multithreading, Leistung usw.;
  • Bietet einen CPD (Copy-Paste Detector) zusammen mit einem PMD, der Duplikate im Code erkennt.
Wenn wir uns alle Diagnoseregeln ansehen, konzentriert sich PMD mehr auf die Lösung von Codierungsstilproblemen und das Erkennen offensichtlicher Fehler. Diagnoseregeln können miteinander in Konflikt stehen und müssen daher vor der Verwendung des Analysegeräts konfiguriert werden. Sie können die Analyse auch über ein Plugin für IntelliJ IDEA ausführen, Sie können jedoch nicht einzelne Dateien für die Analyse auswählen. Das Warnfenster sieht folgendermaßen aus: Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java Heap- und Stack-Speicherfehler – 9Meiner Meinung nach ist die Arbeit mit Warnungen nicht sehr komfortabel, da sie nicht nach Dateien und nicht offensichtlichen Meldungen gruppiert werden können. Sie werden nur angezeigt, wenn Sie mit der Maus über die Warnung fahren.

Abschluss

Natürlich gibt es neben den oben besprochenen Analysatoren auch andere Lösungen. Es gibt sowohl kostenpflichtige (Coverity, Klockwork, JArchitect) als auch kostenlose (Error Prone, Infer, Checkstyle) Programme. Sie alle konzentrieren sich auf eines: zu verhindern, dass falscher oder potenziell fehlerhafter Code in die Produktion gelangt. Ich habe kein Recht zu beurteilen, welches Analysegerät für diese Aufgabe besser geeignet ist. Aber Analysatoren, die Datenflussanalysen und symbolische Ausführung entwickeln, finden mit größerer Wahrscheinlichkeit einen echten Fehler im Code. Wenn Sie sich für einen statischen Analysator entscheiden, achten Sie auf Folgendes:
  • Integration in verschiedene IDEs;
  • Integration in Montagesysteme;
  • einfacher Start des Analysators auf dem Server;
  • die Fähigkeit, Fehler im Codebearbeitungsmodus zu erkennen;
  • die Möglichkeit, bequem mit Warnungen zu arbeiten;
  • SAST-Orientierung;
  • Prozentsatz falsch positiver Ergebnisse;
  • Komplexität der Konfiguration.
  • Die Kombination aller Vor- und Nachteile führt Sie zu der Anzahl der statischen Analysegeräte, die Sie für die besten halten.
Hinweis: Ich habe Beispiele mit Integration in IntelliJ IDEA bereitgestellt, da ich es oft verwende.

Java-Heap- und Stack-Speicherfehler

Quelle: DZone Wir schauen uns nun die Hauptfehler an, die im Java-Heap- oder Stack-Speicher auftreten können, aber erinnern wir uns zunächst daran, was diese beiden Begriffe bedeuten.
  • Der Heap-Speicher ist ein spezieller Speicherbereich, in dem Java-Objekte gespeichert werden.
  • Der Stapelspeicher ist ein Bereich des temporären Speichers zum Speichern von Variablen beim Aufruf einer Methode.
Die Hauptausnahme, die ein Heap-Speicherproblem beschreibt, ist java.lang.OutOfMemoryError . Kaffeepause Nr. 94.  Überprüfung von fünf statischen Java-Code-Analysatoren.  Java Heap- und Stack-Speicherfehler – 10

Java heap space

Dieser Fehler tritt auf, wenn ein Java-Programm kein neues Objekt in einem Heap-Speicherbereich zuordnen kann.

GC-Overhead-Limit überschritten

Ein Java-Programm verbringt zu viel Zeit mit der Garbage Collection. Dieser Fehler tritt auf, wenn die Garbage Collection 98 % der Programmzeit in Anspruch nimmt und weniger als 2 % des Speicherplatzes wiederherstellt.
public class OutOfMemoryErrorDemo {
    public static void main(String[] args) {
        int i = 0;
        List<String> stringList = new ArrayList<>();
        while (i < Integer.MAX_VALUE) {
            i++;
            String generatedString = new String( "Some string generated to show out of memory error example " + i);
            stringList.add(generatedString);
        }
    }
}
Hier enthält stringList einen Verweis auf unsere generierten Strings, sodass der Garbage Collector die generierten Strings nicht aus dem Speicher entfernen kann, sondern versucht, jeden anderen Müll in der Anwendung zu entfernen. Aber das reicht nicht aus.

Die angeforderte Array-Größe überschreitet das VM-Limit

Der Fehler tritt auf, wenn Sie versuchen, ein Array zuzuweisen, wenn im Heap nicht genügend Speicherplatz vorhanden ist.
public class OutOfMemoryErrorDemo {
    public static void main(String[] args) {
        // we try to create too long array
        long[] array = new long[Integer.MAX_VALUE];
    }
}

Metaraum

Mit dieser Meldung wird eine Ausnahme ausgelöst, wenn im Metaspace-Bereich kein Platz für Klassendateninformationen vorhanden ist.

Kein Swap-Speicherplatz (Größenbytes aus Gründen anfordern. Kein Swap-Speicherplatz vorhanden?)

Der Fehler tritt auf, wenn auf dem nativen Heap kein Speicher zugewiesen werden konnte oder dessen Größe nicht ausreicht.

Grund stack_trace_with_native_method

Eine native Java-Schnittstelle oder native Methode konnte keinen Speicher auf dem Heap zuweisen. StackOverFlowError – wenn zu viele Methodenaufrufe vorhanden sind. Normalerweise wird eine Ausnahme von einer Methode ausgelöst, die eine Rekursion enthält.
public class StackOverFlowErrorDemo {

    public static void main(String[] args) {
        recursiveMethod(2);
    }

    public static int recursiveMethod(int i) {
      	// it will never stop and it allocates all stack memory
        return recursiveMethod(i);
    }
}
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION