Halo lagi! Kami membuka set berikutnya di grup yang sekarang kesembilan
, grup
Java Developer (dan grup kesepuluh dalam rencana, tiba-tiba, pada 31 Desember) dan menyiapkan materi yang menarik dan
pelajaran terbuka untuk Anda.
Jadi ayo pergi.
Ingin mengurangi jumlah memori yang digunakan oleh aplikasi Java Anda? Lihat bagaimana Anda dapat meningkatkan kinerja dengan string kompak yang tersedia di Java 9.
Salah satu peningkatan kinerja yang diperkenalkan di JVM (Oracle HotSpot, tepatnya), sebagai bagian dari Java SE 9, ternyata berupa string yang ringkas. Tugas mereka adalah untuk mengurangi ukuran objek String, yang memungkinkan untuk mengurangi jumlah total (jejak) memori yang dikonsumsi oleh aplikasi. Sebagai hasilnya, ini dapat mengurangi jumlah waktu yang dihabiskan untuk mengumpulkan sampah.

Fungsi ini didasarkan pada pengamatan bahwa banyak objek String tidak perlu 2 byte untuk mengkodekan setiap karakter, karena sebagian besar aplikasi hanya menggunakan karakter Latin-1. Karena itu, alih-alih ini:
private final char value[];
Di
java.lang.String
sekarang memiliki ini:
private final byte[] value; private final byte coder;
Dengan kata lain, fungsi ini menggantikan nilai dalam array
char
(di mana setiap elemen menggunakan 2 byte) dengan array byte dengan byte tambahan untuk menentukan pengkodean (Latin-1 atau UTF-16). Ini berarti bahwa dalam sebagian besar aplikasi hanya menggunakan karakter Latin-1, hanya setengah tumpukan yang akan digunakan. Pengguna tidak akan melihat perbedaannya, tetapi API terkait, seperti
StringBuilder
, secara otomatis akan mengambil keuntungan dari ini.
Untuk menunjukkan perubahan ini dalam hal ukuran objek String, saya akan menggunakan Java Object Layout, sebuah utilitas sederhana untuk memvisualisasikan struktur objek pada heap. Dari sudut pandang ini, kami tertarik pada jejak array (disimpan dalam variabel nilai di atas), dan bukan hanya referensi (referensi array byte, seperti referensi array karakter, menggunakan 4 byte). Kode di bawah ini menampilkan informasi menggunakan JOL
GraphLayout
:
public class JOLSample { public static void main(String[] args) { System.out.println(GraphLayout.parseInstance("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz").toFootprint()); } }
) ToFootprint ()); public class JOLSample { public static void main(String[] args) { System.out.println(GraphLayout.parseInstance("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz").toFootprint()); } }
Menjalankan kode di atas di Java 8 dan kemudian di Java 9 menunjukkan perbedaan:
$java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) $java -cp lib\jol-cli-0.9-full.jar;. test.JOLSample java.lang.String@4554617cd footprint: COUNT AVG SUM DESCRIPTION 1 432 432 [C 1 24 24 java.lang.String 2 456 (total) ... $java -version java version "9" Java(TM) SE Runtime Environment (build 9+181) Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode) $java -cp lib\jol-cli-0.9-full.jar;. test.JOLSample java.lang.String@73035e27d footprint: COUNT AVG SUM DESCRIPTION 1 224 224 [B 1 24 24 java.lang.String 2 248 (total)
Mengabaikan ukuran 24 byte dari komponen internal java.lang.String (header plus link), kita melihat bahwa, karena kekompakannya, ukurannya telah berkurang hampir setengahnya.
Jika kita mengganti baris di atas dengan yang lain menggunakan karakter UTF-16, misalnya \ u0780, dan kemudian restart kode di atas, maka Java 8 dan Java 9 akan menunjukkan jejak yang sama, karena kekompakan tidak akan lagi digunakan.
Anda dapat menonaktifkan fungsi ini dengan meneruskan
-XX:-CompactStrings
ke perintah
java
.
Seperti biasa, kami menunggu komentar dan pertanyaan Anda di sini, serta mengundang Anda ke
pelajaran terbuka .