GNU/Linux >> Belajar Linux >  >> Linux

Perbedaan antara tumpukan Java dan tumpukan C asli

Proses Java pada dasarnya terdiri dari dua ruang heap yang berbeda.

  • Heap Java (ruang baru, lama, dan permanen)
  • Dan yang disebut tumpukan C asli.

Hal di atas sering membingungkan dalam hal kesalahan OutOfMemory dan kegagalan alokasi. Khususnya dalam mode 32-bit di mana keseluruhan ruang proses dibatasi hingga 4gb atau bahkan 2gb tergantung pada OS.

Seperti disebutkan sebelumnya, ukuran proses total dalam mode 32-bit dibatasi hingga maksimum 4gb. Java heap dan C heap digabungkan, bersama dengan ruang lain, mis. untuk perpustakaan, utas, dll. tidak dapat melebihi batas 4gb ini. Jadi jika Anda menambah tumpukan Java, mis. dengan meningkatkan -Xmx/-Xms dari 1.5gb ke 2.5gb ini akan memiliki efek samping yang signifikan pada C-heap. Sebelum meningkat, C-heap dapat dengan mudah tumbuh hingga 2gb. Karena ada 4gb -1.5gb =2.5gb tersisa. SETELAH peningkatan tumpukan Java dari 1.5gb menjadi 2.5gb kami hanya memiliki 4gb – 2.5gb =1.5gb tersisa untuk semua ruang lainnya. Termasuk C-heap.

Sayangnya itu sepenuhnya tergantung pada aplikasi seberapa besar tumpukan Java dan tumpukan C yang dibutuhkan. Sementara ukuran tumpukan Java dapat dikonfigurasi secara eksplisit, ini tidak dapat dilakukan untuk tumpukan-C. C-heap hanya berkembang hingga ukuran proses mencapai batas 4gb. Jadi harus berhati-hati jika Anda mengonfigurasi tumpukan Java terlalu besar. Ini dapat dan akan mengakibatkan kegagalan alokasi C-heap. Misalnya. pesan seperti ini biasanya berarti, bahwa C-heap telah habis:

java.lang.OutOfMemoryError: requested 67108872 bytes for Chunk::new. Out of swap space?

Harap perhatikan sintaks C++ dengan titik dua ganda. Atau yang ini:

# There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 65544 bytes

Dalam kedua kasus, C-heap terlalu kecil. Solusinya adalah mengurangi tumpukan Java. Ya, untuk mengurangi! Ini akan memberi C-heap lebih banyak ruang untuk berkembang. Di sisi lain, kita masih bisa menekan Java.lang.OutOfMemoryErrors klasik. Itu jelas menunjukkan kapasitas heap Java yang tidak mencukupi.

Seperti yang Anda lihat, jika Anda beroperasi dalam mode 32-bit, mungkin ada konflik antara Java dan C-heap, yang mungkin tidak mudah diselesaikan. Jika semuanya gagal maka pertimbangkan untuk pindah ke 64-bit, di mana batas ukuran proses 4gb tidak lagi menjadi masalah. Informasi latar belakang:Mesin virtual Java Hotspot (JVM) itu sendiri ditulis dalam C++. Oleh karena itu semua alokasi internal JVM terjadi hanya di C-heap. Misalnya ketika GC memulai untuk mengumpulkan objek mati di heap Java, GC akan mengalokasikan ruang di heap asli untuk melakukan tugasnya.

Di sisi lain, semua objek Java yang dialokasikan oleh program Java akan berakhir di heap Java. C-heap tidak akan disentuh.


Linux
  1. Apa perbedaan antara fsck dan e2fsck?

  2. Apa perbedaan antara adduser dan useradd?

  3. Apa perbedaan antara ls dan l?

  1. Apa perbedaan antara InnoDB dan MyISAM?

  2. Perbedaan Antara [[ $a ==Z* ]] Dan [ $a ==Z* ]?

  3. Apa perbedaan antara $(CC) dan $CC?

  1. Perbedaan Antara ~/.profile Dan ~/.bash_profile?

  2. Perbedaan Nss dan Pam?

  3. Apa perbedaan antara strtok_r dan strtok_s di C?