JavaRush /Java Blog /Random-ID /Rehat kopi #94. Tinjauan lima penganalisis kode Java stat...

Rehat kopi #94. Tinjauan lima penganalisis kode Java statis. Kesalahan memori tumpukan dan tumpukan Java

Dipublikasikan di grup Random-ID

Tinjauan lima penganalisis kode Java statis

Sumber: DZone Pengembang sering kali memerlukan berbagai program, termasuk penganalisis kode statis, yang dapat menemukan dan memperbaiki kode yang salah di awal pengembangan. Meskipun peninjauan kode adalah alat yang sangat berharga dalam upaya ini, terkadang jumlah peninjau kode yang harus ditinjau dan ditinjau sangat besar. Ini membutuhkan banyak waktu dan usaha. Hal ini juga mengarah pada fakta bahwa pengulas sering kali hanya memperhatikan bagian kode yang penting untuk pengoperasian program. Sedangkan alat analisis statis memeriksa semua kode dengan akurasi yang sama. Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan memori tumpukan dan tumpukan Java - 1Saya telah mengumpulkan beberapa penganalisis kode yang kompatibel dengan IntelliJ IDEA. Saya harap ini membantu Anda dalam pekerjaan Anda.

Penganalisis IntelliJ IDEA bawaan

Penganalisis kode Java statis yang dibangun di IntelliJ IDEA sama sekali tidak kalah dengan alat analisis statis khusus. Pencarian fragmen kode yang mencurigakan, berantakan, atau salah dilakukan dengan menggunakan berbagai metode analisis statis: analisis aliran data dan pencocokan pola. IntelliJ IDEA memiliki sejumlah besar inspeksi. Faktanya, banyak dari mereka tidak selalu melaporkan kesalahannya secara akurat. Sebaliknya, mereka menunjukkan kecerobohan dalam kode atau kemungkinan mengubahnya dengan alternatif yang lebih rapi. Setelah mempelajari sedikit “Inspeksi → Java”, saya memperhatikan satu hal. Pemeriksaan pada kategori kemungkinan kesalahan, masalah numerik, dan masalah serialisasi lebih cenderung menemukan kesalahan nyata. Bagaimanapun, Anda harus melakukan pengujian sendiri dan menentukan mana yang berguna untuk proyek Anda. Karena analisis statis dilakukan dalam mode pengeditan kode, di IntelliJ IDEA Anda dapat memperbaiki kesalahan dalam hitungan detik setelah kesalahan terjadi. Editor segera menyoroti bagian kode yang salah. Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan Java Heap dan Stack Memory - 2Ini sangat nyaman dan keren! Selain itu, jika Anda menggunakan kombinasi “Alt + Enter” pada potongan kode yang dipilih, Anda dapat memilih salah satu opsi untuk memperbaiki kesalahan melalui menu konteks: Anda juga dapat mengetahui alasan menjalankan pemeriksaan tertentu Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan Java Heap dan Stack Memory - 3. Dalam beberapa kasus, hal ini mengurangi waktu pencarian: Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan Java Heap dan Stack Memory - 4Anda dapat menjalankan analisis secara manual dengan memilih “Analisis → Periksa Kode”. Atau Anda dapat menjalankan pemeriksaan individual menggunakan “Analisis → Jalankan pemeriksaan berdasarkan nama”. Sebelum melakukan ini, tentukan ruang lingkup analisis (untuk proyek, modul, atau file individual). Saat Anda menjalankan analisis dengan cara ini, tersedia beberapa pemeriksaan yang tidak berfungsi dalam mode edit karena kerumitannya. Setelah dianalisis, hasilnya akan dikelompokkan berdasarkan kategori/direktori dalam jendela terpisah. Dari jendela ini Anda dapat menavigasi ke pemicu validasi tertentu: Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan Java Heap dan Stack Memory - 5IntelliJ hanya memungkinkan Anda menyimpan hasil analisis dalam format HTML dan XML. Sayangnya, menurut pendapat saya, cara paling nyaman untuk menangani masalah yang terdeteksi adalah di IDE itu sendiri. Catatan. Sebagian besar fitur penganalisis statis tersedia di IntelliJ IDEA Community Edition gratis.

SonarJava

SonarJava adalah penganalisis kode statis untuk Java dari SonarSource. Daftar fungsinya meliputi:
  • 150+ aturan deteksi kesalahan;
  • 350+ aturan untuk mengenali bau kode;
  • 40+ aturan untuk mendeteksi potensi kerentanan ;
  • Integrasi dengan Maven, Gradle, Ant, Eclipse, IntelliJ IDEA, VS Code;
  • Dapat diperluas dengan aturan diagnostik khusus;
  • Alat SAST khusus: sebagian besar aturan diagnostik dikompilasi sesuai dengan CWE , CERT , OWASP .
Anda dapat menjalankan analisis di berbagai IDE (melalui plugin SonarLint ) dan secara terpisah di SonarQube . SonarLint dapat bekerja berdampingan dengan penganalisis kode IntelliJ IDEA bawaan. Jika Anda mengarahkan kursor ke bagian kode yang disorot, Anda sering kali dapat melihat peringatan dari kedua penganalisis: Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan Java Heap dan Stack Memory - 6Tentu saja, Anda dapat melihat peringatan tersebut di jendela terpisah: Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan Java Heap dan Stack Memory - 7Secara keseluruhan, kemampuan untuk menjalankan SonarJava dengan cara yang berbeda membuatnya menarik. Hal ini memberikan kebebasan kepada pengembang untuk memilih alat saat menulis kode.

TemukanBugs/SpotBugs

Sayangnya, FindBugs sudah lama tidak diperbarui; rilis stabil terakhir dirilis pada tahun 2015. Tapi kami masih mengingat dan menggunakannya, karena ini mungkin penganalisis kode Java statis gratis yang paling terkenal. Jika Anda bertanya kepada pengembang Java tentang analisis statis, mereka mungkin akan langsung memikirkan FindBugs. Penganalisis open source SpotBugs menjadi kelanjutan logis dari FindBugs yang ditinggalkan. Ia memiliki semua kelebihan dan kekurangan FindBugs. Waktu akan membuktikan apakah ini baik atau buruk. Sementara itu, komunitas penganalisa sedang aktif mengembangkannya. Fitur utama SpotBugs:
  • 400+ aturan deteksi kesalahan;
  • Integrasi ke Ant, Maven, Gradle, Eclipse, IntelliJ IDEA;
  • Dapat diperluas dengan aturan diagnostik khusus.
Untuk menemukan kode yang mencurigakan, metodologi yang sama digunakan: pencocokan pola dan analisis aliran data. Penganalisis mendeteksi berbagai jenis kesalahan yang terkait dengan multithreading, kinerja, kerentanan, kebingungan kode, dan sebagainya. Di IntelliJ IDEA, jendela peringatan terlihat seperti ini: Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan Java Heap dan Stack Memory - 8Peringatan dapat dikelompokkan berdasarkan kategori, kelas, direktori, dan tingkat kepercayaan. Anda dapat secara bersamaan melihat peringatan dan dokumentasi untuk aturan diagnostik apa pun. Analisis dimulai secara manual. Setelah analisis, semua fragmen kode yang bermasalah disorot bersama dengan peringatan lain dari IntelliJ IDEA dan SonarLint. Namun, ada masalah. Anda harus menjalankan kembali analisis untuk memperbarui peringatan agar mencerminkan perubahan yang Anda buat pada file. Ada juga banyak peringatan penasehat, sehingga penganalisis harus dikonfigurasi sebelum penggunaan aktif.

PVS-Studio

PVS-Studio didasarkan pada perpustakaan sumber terbuka Spoon. Dibutuhkan kode sumber sebagai masukan dan membangun model AST yang dirancang dengan baik dengan informasi semantik. Berdasarkan model ini, penganalisis menggunakan teknik modern seperti:
  • Analisis aliran data;
  • Pertunjukan simbolis;
  • Anotasi metode;
  • Analisis berbasis pola.
Saat ini, penganalisis menggunakan lebih dari 105 aturan diagnostik yang mengidentifikasi berbagai kelemahan kode. Ini termasuk koreksi kesalahan ketik, penggantian nama referensi nol, kode tidak dapat dijangkau, indeks array di luar batas, pelanggaran penggunaan kontrak metode, dan kesalahan lainnya. Anda dapat mengetahui semua kemampuan aturan diagnostik di sini . Fungsi utama PVS-Studio:
  • Penganalisis difokuskan untuk menemukan kesalahan nyata;
  • Selain versi CLI juga terdapat integrasi dengan IntelliJ IDEA, Maven, Gradle, Jenkins, SonarQube;
  • Kemampuan untuk menjalankan penganalisis dalam mode tambahan;
  • Penganalisis mengidentifikasi potensi masalah kompatibilitas dengan Java SE API saat memigrasikan proyek dari Java 8 ke versi yang lebih baru;
  • PVS-Studio mengubah laporan ke dalam berbagai format yang mudah digunakan: JSON, XML, HTML, TXT;
  • Alat SAST khusus: sebagian besar aturan diagnostik dikompilasi sesuai dengan CWE , CERT , OWASP .

PMD

PMD adalah penganalisis statis sumber terbuka. Ini mengidentifikasi kesalahan pengembangan yang umum: variabel yang tidak digunakan, blok kosong, pembuatan objek yang tidak diperlukan, dan masalah lainnya. Penganalisis menggunakan kode sumber sebagai masukan. Saat ini, PMD menganalisis satu file sumber per proses, yang memberikan batasan pada kelengkapan analisis. Penulis PMD menyarankan untuk menyusun proyek sebelum menganalisis. Ini memungkinkan Anda mengekstrak informasi tentang tipe yang digunakan dalam kode yang dianalisis. Fungsi utama PMD:
  • Integrasi dengan berbagai IDE (IntelliJ IDEA, Eclipse, NetBeans) dan sistem build (Maven, Gradle, Ant);
  • Mendukung berbagai format laporan penganalisa: SARIF, CSV, IDEA, JSON, teks (default), XML, HTML, TextColor dan sebagainya;
  • Memiliki lebih dari 300 templat aturan diagnostik. Kategori: gaya pengkodean, praktik terbaik, bug, multithreading, kinerja, dan sebagainya;
  • Menyediakan CPD (Copy-Paste Detector) bersama dengan PMD yang mendeteksi duplikat dalam kode.
Jika kita melihat semua aturan diagnostik, PMD lebih fokus pada penyelesaian masalah gaya pengkodean dan menangkap kesalahan yang jelas. Aturan diagnostik mungkin bertentangan satu sama lain, sehingga aturan tersebut harus dikonfigurasi sebelum menggunakan penganalisis. Anda juga dapat menjalankan analisis melalui plugin untuk IntelliJ IDEA, namun Anda tidak dapat memilih file satu per satu untuk dianalisis. Jendela peringatan terlihat seperti ini: Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan Java Heap dan Stack Memory - 9Menurut pendapat saya, bekerja dengan peringatan sangat tidak nyaman, karena peringatan tidak dapat dikelompokkan berdasarkan file dan pesan yang tidak jelas. Mereka hanya muncul ketika Anda mengarahkan kursor ke peringatan tersebut.

Kesimpulan

Tentu saja, selain analisa yang dibahas di atas, ada solusi lain. Ada program berbayar (Coverity, Klockwork, JArchitect) dan gratis (Rawan Kesalahan, Infer, Checkstyle). Semuanya fokus pada satu hal: mencegah kode yang salah atau berpotensi bermasalah mencapai produksi. Saya tidak berhak menilai penganalisis mana yang lebih cocok untuk tugas ini. Namun penganalisis yang mengembangkan analisis aliran data dan eksekusi simbolik lebih mungkin menemukan bug nyata dalam kode. Jika Anda memilih penganalisis statis, perhatikan:
  • integrasi ke berbagai IDE;
  • integrasi ke dalam sistem perakitan;
  • kemudahan meluncurkan penganalisis di server;
  • kemampuan untuk mendeteksi kesalahan dalam mode pengeditan kode;
  • kemampuan untuk bekerja dengan nyaman dengan peringatan;
  • orientasi SAST;
  • persentase positif palsu;
  • kompleksitas konfigurasi.
  • Kombinasi dari semua pro dan kontra akan membawa Anda ke jumlah penganalisis statis yang Anda anggap terbaik.
Catatan: Saya memberikan contoh integrasi ke IntelliJ IDEA karena saya sering menggunakannya.

Kesalahan memori tumpukan dan tumpukan Java

Sumber: DZone Sekarang kita akan melihat kesalahan utama yang dapat terjadi di memori heap atau stack Java, tapi pertama-tama mari kita ingat apa arti kedua istilah ini.
  • Memori heap adalah area memori khusus tempat objek java disimpan.
  • Memori tumpukan adalah area memori sementara untuk menyimpan variabel saat memanggil suatu metode.
Pengecualian utama yang menjelaskan masalah memori heap adalah java.lang.OutOfMemoryError . Rehat kopi #94.  Tinjauan lima penganalisis kode Java statis.  Kesalahan Java Heap dan Stack Memory - 10

Ruang Tumpukan Java

Kesalahan ini terjadi ketika program Java gagal mengalokasikan objek baru di area memori heap.

Batas Overhead GC Terlampaui

Program Java menghabiskan terlalu banyak waktu untuk melakukan pengumpulan sampah. Kesalahan ini muncul ketika pengumpulan sampah menghabiskan 98% waktu program dan memulihkan kurang dari 2% ruang memori.
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);
        }
    }
}
Di sini stringList berisi referensi ke string yang kami hasilkan, sehingga pengumpul sampah tidak dapat menghapus string yang dihasilkan dari memori, tetapi mencoba menghapus sampah lain di aplikasi. Tapi ini tidak cukup.

Ukuran Array yang Diminta Melebihi Batas VM

Kesalahan terjadi ketika Anda mencoba mengalokasikan array ketika tidak ada cukup ruang di heap.
public class OutOfMemoryErrorDemo {
    public static void main(String[] args) {
        // we try to create too long array
        long[] array = new long[Integer.MAX_VALUE];
    }
}

ruang meta

Pengecualian diberikan dengan pesan ini ketika tidak ada ruang di wilayah metaspace untuk informasi data kelas.

Tidak ada ruang swap (Minta Ukuran Byte karena Alasan. Ruang Swap Kehabisan?)

Kesalahan muncul ketika memori tidak dapat dialokasikan pada heap asli atau ukurannya tidak mencukupi.

alasan stack_trace_with_native_method

Antarmuka Java asli atau metode asli gagal mengalokasikan memori di heap. StackOverFlowError - ketika ada terlalu banyak pemanggilan metode. Biasanya pengecualian diberikan oleh metode yang memiliki rekursi di dalamnya.
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);
    }
}
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION