Diğerlerinin doğru bir şekilde belirttiği gibi, bir işlem tarafından kullanılan gerçek bellek, paylaşılan bölgeler ve mmap'ed dosyaları ile ne olduğu ile ilgili bir işlem yapmak zor.
Deneyci iseniz valgrind ve massif çalıştırabilirsiniz . Bu, sıradan kullanıcılar için biraz ağır olabilir, ancak bir uygulamanın zaman içindeki belleği hakkında bir fikir edinebilirsiniz. Eğer bir uygulama malloc () tam olarak neye ihtiyacı varsa o zaman bu size bir işlemin gerçek dinamik bellek kullanımının iyi bir gösterimini verecektir. Ancak bu deney "zehirlenmiş" olabilir.
Meseleleri karmaşıklaştırmak için, Linux hafızanızı doldurmanıza izin verir . Malloc () hafızasında, hafıza kullanma niyetinizi belirtirsiniz. Ancak, tahsis edilen "RAM" inizin yeni sayfasına bir byte yazana kadar ayırma gerçekleşmez. Bunun gibi küçük bir C programı yazıp çalıştırarak bunu kendinize kanıtlayabilirsiniz:
// test.c
#include <malloc.h>
#include <stdio.h>
#include <unistd.h>
int main() {
void *p;
sleep(5)
p = malloc(16ULL*1024*1024*1024);
printf("p = %p\n", p);
sleep(30);
return 0;
}
# Shell:
cc test.c -o test && ./test &
top -p $!
Bunu 16GB'tan az RAM olan bir makinede çalıştırın ve işte !, 16GB bellek kazandınız! (hayır gerçek değil).
top
Size dikkat edin: "VIRT" 16.004G, ancak% MEM 0.0
Bunu tekrar valgrind ile çalıştırın:
# Shell:
valgrind --tool=massif ./test &
sleep 36
ms_print massif.out.$! | head -n 30
Ve massif "bütün allocs toplamı () = 16GB" diyor. Yani bu çok ilginç değil.
AMA, eğer aklı başında bir süreçle çalıştırırsanız :
# Shell:
rm test test.o
valgrind --tool=massif cc test.c -o test &
sleep 3
ms_print massif.out.$! | head -n 30
--------------------------------------------------------------------------------
Command: cc test.c -o test
Massif arguments: (none)
ms_print arguments: massif.out.23988
--------------------------------------------------------------------------------
KB
77.33^ :
| #:
| :@::@:#:
| :::::@@::@:#:
| @:: :::@@::@:#:
| ::::@:: :::@@::@:#:
| ::@:::@:::::@:: :::@@::@:#:
| @::@:::@:::::@:: :::@@::@:#:
| @::@:::@:::::@:: :::@@::@:#:
| :@@@@@@@@@@@@@@@@@@@@:@::@:::@:::::@:: :::@@::@:#:
| :@@ :@::@:::@:::::@:: :::@@::@:#:
| :@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| ::::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| ::::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
0 +----------------------------------------------------------------------->Mi
0 1.140
Ve burada görüyoruz ki (çok ampirik ve çok güvenli bir şekilde) derleyicinin 77KB yığın ayırdığını.
Neden sadece yığın kullanımı elde etmek için bu kadar çok deniyorsunuz? Çünkü bir işlemin kullandığı tüm paylaşılan nesneler ve metin bölümleri (bu örnekte, derleyici) çok ilginç değildir. Bir işlem için sabit giderler. Aslında, sürecin sonraki çağrıları neredeyse "özgür" geliyor.
Ayrıca, aşağıdakileri karşılaştırın ve karşılaştırın.
MMAP () 1 GB'lık bir dosya. VMSize'iniz 1 + GB olacaktır. Ancak, Resident Set Size yalnızca sayfalandırılmış olduğunuz dosyanın bölümleri olacaktır (bir işaretçiyi o bölgeye işaretleyerek). Ve eğer tüm dosyayı "okursanız", o zaman sona erdiğinde, çekirdek başlangıçta disk belleği eklemiş olabilir (çekirdekli kodlar yeniden tanımlanırsa bu sayfaları tam olarak nasıl / nerede değiştireceğini bildiği için ). Her iki durumda da, ne VMSize ne de RSS, hafızanızın "kullanımı" için iyi bir gösterge değildir. Aslında hiçbir şey yapmadın, malloc ().
Buna karşılık, Malloc () ve LOTS belleğe dokunun - belleğiniz diske geçene kadar. Böylece, tahsis edilmiş hafızanız şimdi RSS'inizi aşıyor Burada, VMSize'iniz size bir şey söylemeye başlayabilir (işleminiz RAM'inizde olduğundan daha fazla belleğe sahip). Ancak paylaşılan sayfalar olan VM ile değiştirilmiş veri olan VM arasında ayrım yapmak hala zor.
Valgrind / massif'in ilginçleştiği yer burasıdır. Size kasıtlı olarak neyi paylaştığınızı gösterir (sayfalarınızın durumuna bakılmaksızın).
htop
yazarın cevabını geçen gün sahip olduğum benzer bir soruyla paylaşmalıyım ... / proc / meminfo'dan bellek kullanımı nasıl hesaplanır (htop gibi)