Untuk mengurangkan penggunaan memori aplikasi Java, anda boleh memulakan dengan penalaan parameter JVM, memilih GC ringan, mengurangkan pemuatan kelas dan mengoptimumkan tabiat pengekodan. 1. Laraskan parameter memori JVM, seperti -xmx dan -xms untuk mengawal saiz timbunan, dan -xx: ParallelGCThreads mengehadkan bilangan benang GC; 2. Gunakan pengumpul sampah yang lebih ringan seperti siri GC atau scavenge selari; 3. Tidak termasuk kebergantungan yang tidak berguna, gunakan Proguard untuk menanam kod dan memantau MetaSpace; 4. Elakkan cache yang tidak disensor, penyalahgunaan kolam renang dan kelas koleksi untuk menjadi terlalu besar, dan disyorkan untuk menggunakan streaming untuk menggantikan penciptaan koleksi yang besar.
Jejak memori aplikasi Java secara langsung mempengaruhi prestasi dan penggunaan sumber, terutamanya dalam persekitaran awan atau penyebaran kontena. Untuk mengurangkan penggunaan memori program Java, anda boleh bermula dari penalaan parameter JVM, pengoptimuman kod, pengurusan pergantungan, dan tingkah laku runtime.

Laraskan parameter memori JVM
Tetapan memori lalai JVM sering konservatif atau tidak sesuai untuk senario aplikasi tertentu. Pelarasan yang munasabah terhadap saiz memori timbunan dan parameter lain yang berkaitan dapat mengurangkan jejak memori keseluruhan:
- Kawal had memori timbunan : Tetapkan memori timbunan maksimum melalui
-Xmx
untuk mengelakkan permohonan yang berlebihan. Sebagai contoh-Xmx512m
bermakna sehingga 512MB memori timbunan digunakan. - Kurangkan saiz timbunan awal : Gunakan
-Xms
untuk menetapkan saiz timbunan awal yang lebih kecil, seperti-Xms64m
, untuk mengelakkan ingatan yang berlebihan daripada dimakan semasa permulaan. - Matikan Thread Helper GC yang tidak perlu : Sesetengah pengumpul sampah secara automatik menghidupkan beberapa benang berdasarkan bilangan teras CPU. Jika beban aplikasi tidak tinggi, anda boleh mengehadkan bilangan benang secara manual, seperti menggunakan
-XX:ParallelGCThreads=2
. - Dayakan Penjejakan Memori Asli : Gunakan
-XX:NativeMemoryTracking=summary
untuk melihat penggunaan memori bukan HEAP dan menemui kebocoran memori asli yang berpotensi.
Parameter ini bukan "satu dan semua" dan perlu diuji dan diselaraskan mengikut beban sebenar.

Gunakan pemungut sampah yang lebih ringan
Versi yang berbeza dari JVM menyediakan pelbagai pengumpul sampah, dan memilih GC yang betul mempunyai kesan langsung pada jejak ingatan:
- G1GC adalah GC lalai JDK 8 dan ke atas, sesuai untuk senario memori yang besar, tetapi overhead memori agak tinggi.
- ZGC dan Shenandoah GC adalah GC latency rendah yang sesuai untuk aplikasi sensitif masa yang besar dan tindak balas, tetapi mereka sendiri juga membawa beberapa penggunaan memori tambahan.
- Sekiranya permohonan anda adalah perkhidmatan kecil atau microservice, pertimbangkan untuk menggunakan siri GC atau scavenge selari , yang menggunakan memori yang kurang, walaupun jeda mungkin sedikit lebih lama.
Sebagai contoh, bagaimana untuk membolehkan siri GC:

java -xx: useserialgc -jar your_app.jar
Jika anda tidak memerlukan prestasi GC muktamad, berubah menjadi GC yang lebih ringan sering dapat menjimatkan banyak ruang dalam ingatan.
Kurangkan pemuatan kelas dan penggunaan metaspace
Java secara dinamik memuat kelas semasa runtime dan menyimpannya di Metaspace (metaspace). Semakin banyak kelas, lebih banyak metaspace diduduki. Bahagian memori ini dapat dikurangkan dengan cara berikut:
- Kecualikan kebergantungan yang tidak berguna : Semak
pom.xml
ataubuild.gradle
untuk menghapuskan perpustakaan yang tidak digunakan, terutamanya rangka kerja yang secara automatik memperkenalkan sejumlah besar kelas. - Kod Obfuscation dan Tanaman Menggunakan Proguard atau R8 : Ini boleh menghapuskan kelas dan kaedah yang tidak dirakamkan semasa fasa membina, mengurangkan jumlah pakej balang akhir, dan juga mengurangkan bilangan kelas yang dimuatkan pada runtime.
- Memantau penggunaan Metaspace : Gunakan
jstat -gc <pid>
atau alat JMX untuk melihat trend pertumbuhan metaPace dan menemui masalah tepat pada masanya.
Sebagai contoh, lihat penggunaan metaPase semasa:
jStat -gc $ (jps | grep yourapp | awk '{print $ 1}')
Tabiat pengekodan untuk mengelakkan sisa ingatan
Ramai pemaju Java cenderung mengabaikan beberapa perangkap penggunaan memori yang biasa, seperti:
- Cache tidak dibersihkan : Apabila menggunakan
HashMap
atauConcurrentHashMap
untuk melaksanakan cache tempatan, jika tidak ada mekanisme tamat tempoh, kebocoran memori mungkin. Adalah disyorkan untuk menggunakan perpustakaan cache sepertiCaffeine
atauEhcache
dengan strategi pembersihan mereka sendiri. - String penyalahgunaan kolam tetap : Panggilan kerap ke
String.intern()
akan meletakkan rentetan ke dalam generasi tetap atau metaPace, yang boleh menyebabkan OOM. - Inisialisasi kelas koleksi terlalu besar : contohnya,
new ArrayList<>(10000)
akan memperuntukkan sejumlah besar memori pada satu masa, walaupun begitu banyak elemen tidak digunakan pada masa akan datang.
Contohnya:
// list <string> list = new ArrayList <> (); untuk (int i = 0; i <10000; i) { list.add ("Item" i); } // lebih banyak amalan penjimatan memori (jika ia hanya traversal) IntStream.range (0, 10000) .maptoObj (i -> "item" i) .foreach (...);
Pada dasarnya itu sahaja. Pengoptimuman memori Java bukan sesuatu yang dapat dicapai semalaman, dan ia sering menjadi perdagangan antara prestasi dan ingatan. Kuncinya adalah pemantauan berterusan dan pengoptimuman yang disasarkan, supaya tidak membiarkan konfigurasi lalai menutup masalah.
Atas ialah kandungan terperinci Teknik Pengurangan Jejak Memori Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Java menyokong pengaturcaraan asynchronous termasuk penggunaan aliran yang boleh diselesaikan, aliran responsif (seperti ProjectReactor), dan benang maya di Java19. 1.CompletableFuture meningkatkan kebolehbacaan dan penyelenggaraan kod melalui panggilan rantai, dan menyokong orkestrasi tugas dan pengendalian pengecualian; 2. ProjectReactor menyediakan jenis mono dan fluks untuk melaksanakan pengaturcaraan responsif, dengan mekanisme tekanan belakang dan pengendali yang kaya; 3. Thread maya mengurangkan kos konvensional, sesuai untuk tugas I/O-intensif, dan lebih ringan dan lebih mudah untuk berkembang daripada benang platform tradisional. Setiap kaedah mempunyai senario yang berkenaan, dan alat yang sesuai harus dipilih mengikut keperluan anda dan model campuran harus dielakkan untuk mengekalkan kesederhanaan

Di Java, enums sesuai untuk mewakili set tetap tetap. Amalan terbaik termasuk: 1. Gunakan enum untuk mewakili keadaan tetap atau pilihan untuk meningkatkan keselamatan jenis dan kebolehbacaan; 2. Tambah sifat dan kaedah untuk meningkatkan fleksibiliti, seperti menentukan bidang, pembina, kaedah penolong, dan lain -lain; 3. Gunakan enummap dan enumset untuk meningkatkan prestasi dan jenis keselamatan kerana mereka lebih cekap berdasarkan tatasusunan; 4. Elakkan penyalahgunaan enum, seperti nilai dinamik, perubahan kerap atau senario logik kompleks, yang harus digantikan dengan kaedah lain. Penggunaan enum yang betul boleh meningkatkan kualiti kod dan mengurangkan kesilapan, tetapi anda perlu memberi perhatian kepada sempadannya yang berkenaan.

Javanio adalah IOAPI baru yang diperkenalkan oleh Java 1.4. 1) bertujuan untuk penampan dan saluran, 2) mengandungi komponen teras penampan, saluran dan pemilih, 3) menyokong mod tidak menyekat, dan 4) mengendalikan sambungan serentak lebih cekap daripada IO tradisional. Kelebihannya dicerminkan dalam: 1) IO yang tidak menyekat mengurangkan overhead thread, 2) Buffer meningkatkan kecekapan penghantaran data, 3) pemilih menyedari multiplexing, dan 4) memori pemetaan memori sehingga membaca dan menulis fail. Nota Apabila menggunakan: 1) Operasi flip/jelas penampan mudah dikelirukan, 2) Data yang tidak lengkap perlu diproses secara manual tanpa menyekat, 3) Pendaftaran pemilih mesti dibatalkan dalam masa, 4) NIO tidak sesuai untuk semua senario.

HashMap melaksanakan penyimpanan pasangan nilai utama melalui jadual hash di Java, dan terasnya terletak di lokasi data yang cepat. 1. Mula -mula gunakan kaedah hashcode () kunci untuk menghasilkan nilai hash dan mengubahnya menjadi indeks array melalui operasi bit; 2 Objek yang berbeza boleh menghasilkan nilai hash yang sama, mengakibatkan konflik. Pada masa ini, nod dipasang dalam bentuk senarai yang dipautkan. Selepas JDK8, senarai yang dipautkan terlalu panjang (panjang lalai 8) dan ia akan ditukar kepada pokok merah dan hitam untuk meningkatkan kecekapan; 3. Apabila menggunakan kelas tersuai sebagai kunci, sama () dan kaedah hashcode () mesti ditulis semula; 4. HashMap secara dinamik mengembangkan kapasiti. Apabila bilangan elemen melebihi kapasiti dan multiplies oleh faktor beban (lalai 0.75), mengembangkan dan mengembalikan; 5. hashmap tidak selamat benang, dan concu harus digunakan dalam multithreaded

Penghitungan Java bukan sahaja mewakili pemalar, tetapi juga boleh merangkum tingkah laku, membawa data, dan melaksanakan antara muka. 1. Penghitungan adalah kelas yang digunakan untuk menentukan contoh tetap, seperti minggu dan negeri, yang lebih selamat daripada rentetan atau bilangan bulat; 2. Ia boleh membawa data dan kaedah, seperti nilai lulus melalui pembina dan menyediakan kaedah akses; 3. Ia boleh menggunakan suis untuk mengendalikan logik yang berbeza, dengan struktur yang jelas; 4. Ia boleh melaksanakan antara muka atau kaedah abstrak untuk membuat tingkah laku yang berbeza dari nilai penghitungan yang berbeza; 5. Beri perhatian untuk mengelakkan penyalahgunaan, perbandingan kod keras, pergantungan pada nilai ordinal, dan penamaan dan bersiri yang munasabah.

Corak reka bentuk singleton di Java memastikan bahawa kelas hanya mempunyai satu contoh dan menyediakan titik akses global melalui pembina swasta dan kaedah statik, yang sesuai untuk mengawal akses kepada sumber yang dikongsi. Kaedah pelaksanaan termasuk: 1. 2. Pemprosesan Safe Thread, memastikan bahawa hanya satu contoh yang dibuat dalam persekitaran berbilang threaded melalui kaedah penyegerakan atau penguncian cek berganda, dan mengurangkan kesan prestasi; 3. 4. Pelaksanaan penghitungan, menggunakan penghitungan Java untuk secara semulajadi menyokong serialisasi, keselamatan thread dan mencegah serangan reflektif, adalah kaedah ringkas dan boleh dipercayai. Kaedah pelaksanaan yang berbeza boleh dipilih mengikut keperluan khusus

Pilihan dapat jelas menyatakan niat dan mengurangkan bunyi kod untuk penghakiman null. 1. Pilihan.Ofnullable adalah cara biasa untuk menangani objek null. Sebagai contoh, apabila mengambil nilai dari peta, Orelse boleh digunakan untuk memberikan nilai lalai, supaya logik lebih jelas dan ringkas; 2. Gunakan panggilan rantaian peta untuk mencapai nilai bersarang untuk menghindari NPE dengan selamat, dan secara automatik menamatkan jika ada pautan adalah null dan mengembalikan nilai lalai; 3. Penapis boleh digunakan untuk penapisan bersyarat, dan operasi seterusnya akan terus dilakukan hanya jika syarat -syarat dipenuhi, jika tidak, ia akan melompat terus ke Orelse, yang sesuai untuk penghakiman perniagaan ringan; 4. Ia tidak disyorkan untuk menggunakan terlalu banyak pilihan, seperti jenis asas atau logik mudah, yang akan meningkatkan kerumitan, dan beberapa senario akan terus kembali ke NU.

Penyelesaian teras untuk menghadapi java.io.notserializableException adalah untuk memastikan bahawa semua kelas yang perlu bersiri melaksanakan antara muka berseri dan periksa sokongan serialisasi objek bersarang. 1. Tambah implementsSerializable ke kelas utama; 2. Pastikan kelas medan tersuai yang sepadan di dalam kelas juga melaksanakan bersiri; 3. Gunakan sementara untuk menandakan medan yang tidak perlu bersiri; 4. Periksa jenis yang tidak berseri dalam koleksi atau objek bersarang; 5. Semak kelas mana yang tidak melaksanakan antara muka; 6. Pertimbangkan reka bentuk pengganti untuk kelas yang tidak dapat diubah suai, seperti menyimpan data utama atau menggunakan struktur pertengahan berseri; 7. Pertimbangkan untuk mengubah suai
