Saya menjalankan top
untuk memantau kinerja server saya dan 2 dari proses java saya menunjukkan memori virtual hingga 800MB-1GB. Itu adalah hal yang buruk?
Apa yang dimaksud dengan memori virtual?
Dan oh btw, saya punya swap 1GB dan itu menunjukkan 0% digunakan. Jadi saya bingung.
Proses Java = 1 server Tomcat + daemon java saya sendiri Server = Ubuntu 9.10 (karmic)
linux
virtualization
memory
top
kapso
sumber
sumber
Jawaban:
Memori virtual bahkan belum tentu memori. Sebagai contoh, jika suatu proses memori memetakan file besar, file tersebut sebenarnya disimpan dalam disk, tetapi masih membutuhkan "ruang alamat" dalam proses.
Ruang alamat (mis. Memori virtual dalam daftar proses) tidak memerlukan biaya apa pun; itu tidak nyata. Apa yang sebenarnya adalah kolom RSS (RES), yang merupakan memori penduduk. Itulah seberapa banyak memori aktual Anda yang digunakan oleh suatu proses.
Tetapi bahkan itu bukan jawaban keseluruhan. Jika suatu proses memanggil fork (), ia terbagi menjadi dua bagian, dan keduanya pada awalnya membagikan semua RSS mereka. Jadi, bahkan jika RSS awalnya 1 GB, hasil setelah forking akan menjadi dua proses, masing-masing dengan RSS 1 GB, tetapi Anda masih menggunakan memori hanya 1 GB.
Bingung belum? Inilah yang benar-benar perlu Anda ketahui: gunakan
free
perintah dan periksa hasilnya sebelum dan sesudah memulai program Anda (on the+/- buffers/cache
line). Perbedaan tersebut adalah berapa banyak baru memori program yang baru-mulai digunakan.sumber
smem
.java -Xmx16g RunLong
, yang akan mencadangkan 16GB memori untuk proses java, maka diVIRT
atas, tampaknya 16GB dihitung. Dalam hal ini, apa jenis memori 16Gb ini, apakah itu memori yang dipetakan atau ..?Dari halaman manual (1) teratas:
Di mana RES berarti memori penduduk (memori fisik yang digunakan).
Sebenarnya itu tidak benar (lagi). Ketika dikatakan "swap," itu juga termasuk file yang telah dipetakan oleh program ke dalam ruang alamatnya, yang mungkin atau mungkin belum benar-benar mengkonsumsi RAM nyata. Memori ini didukung file tetapi tidak benar-benar bertukar.
VIRT juga termasuk halaman yang telah dialokasikan tetapi belum digunakan untuk apa pun. Setiap halaman dalam keadaan ini dipetakan ke kernel Zero Page (konsep brilian - Anda harus mencarinya) sehingga muncul di VIRT tetapi sebenarnya tidak mengkonsumsi memori apa pun.
sumber
-m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT
. Sangat disayangkan bahwa saya tidak bisa mengecilkan jawaban ini.Saya menemukan penjelasan dari Mugurel Sumanariu ini sangat jelas:
sumber
Kolom VIRT di ps / output atas hampir tidak relevan untuk mengukur penggunaan memori. Jangan khawatir tentang itu. Apache beban berat VIRT vs memori RES
https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used
sumber
Linux mendukung memori virtual, yaitu, menggunakan disk sebagai perpanjangan RAM sehingga ukuran efektif dari memori yang dapat digunakan tumbuh bersamaan. Kernel akan menulis isi blok memori yang saat ini tidak digunakan ke hard disk sehingga memori dapat digunakan untuk tujuan lain. Ketika konten asli diperlukan lagi, mereka dibaca kembali ke dalam memori. Ini semua dibuat sepenuhnya transparan bagi pengguna; program yang berjalan di Linux hanya melihat jumlah memori yang lebih besar tersedia dan tidak memperhatikan bahwa sebagian dari mereka berada pada disk dari waktu ke waktu. Tentu saja, membaca dan menulis hard disk lebih lambat (pada urutan seribu kali lebih lambat) daripada menggunakan memori nyata, sehingga program tidak berjalan secepat. Bagian dari hard disk yang digunakan sebagai memori virtual disebut ruang swap.
Linux dapat menggunakan file normal di sistem file atau partisi terpisah untuk ruang swap. Partisi swap lebih cepat, tetapi lebih mudah untuk mengubah ukuran file swap (tidak perlu mempartisi ulang seluruh hard disk, dan mungkin menginstal semuanya dari awal). Ketika Anda tahu berapa banyak ruang swap yang Anda butuhkan, Anda harus pergi untuk partisi swap, tetapi jika Anda tidak pasti, Anda dapat menggunakan file swap terlebih dahulu, gunakan sistem untuk sementara waktu sehingga Anda bisa merasakan berapa banyak swap Anda butuhkan, dan kemudian buat partisi swap ketika Anda yakin tentang ukurannya.
Anda juga harus tahu bahwa Linux memungkinkan seseorang untuk menggunakan beberapa partisi swap dan / atau bertukar file secara bersamaan. Ini berarti bahwa jika Anda hanya sesekali membutuhkan jumlah ruang swap yang tidak biasa, Anda dapat mengatur file swap tambahan pada saat-saat seperti itu, alih-alih menjaga seluruh jumlah yang dialokasikan sepanjang waktu.
Catatan tentang terminologi sistem operasi: ilmu komputer biasanya membedakan antara bertukar (menulis seluruh proses untuk bertukar ruang) dan paging (menulis hanya bagian ukuran tetap, biasanya beberapa kilobyte, pada suatu waktu). Paging biasanya lebih efisien, dan itulah yang dilakukan Linux, tetapi terminologi Linux tradisional berbicara tentang bertukar.
Sumber: http://www.faqs.org/docs/linux_admin/x1752.html
sumber
VIRtual
kolom bagian atas, mengacu pada ruang-super (ruang konsumsi super) dari proses, yang prosesnya mungkin tidak benar-benar mengambil pada waktu berjalan. Ada kolom lainRESident
, yang merujuk pada memori fisik aktual / ruang yang dialokasikan oleh proses, pada saat runtime.Alasan perbedaan, antara keduanya, dapat dipahami dengan contoh: jika proses menggunakan perpustakaan tertentu, maka ukuran perpustakaan, juga akan membantu ke
virtual-size
. Namun, karena hanya sebagian perpustakaan yang akan digunakan (yaitu beberapa metode yang digunakan), sehingga akan membanturesident-size
.Rujuk untuk Info Lebih Lanjut
sumber
"VIRT" hanya membahas ruang, RES adalah memori "nyata", tetapi jumlah "SHR" (= dibagi) dari "RES" adalah bagian dari RES yang dibagi dengan proses lain. Jadi untuk sebagian besar proses, saya percaya bahwa dengan mengurangi SHR dari RES memberi Anda jumlah memori yang benar-benar disebabkan oleh proses khusus ini.
sumber