← man/system_diagnostics
vmmap — man vmmap — 80×24
ugur@toprak:~/man/system_diagnostics$man vmmap
Bölüm 1 Sistem Tanılama

vmmap

Bir süreçte ayrılan sanal bellek bölgelerini görüntüler

Kullanım

      vmmap [-s] [-w] [-v] [-attributes] [-pages] [-interleaved] [-submap] [-allSplitLibs]
	   [-noCoalesce] [-summary] pid | kısmi-çalıştırılabilir-adı | bellek-grafiği-dosyası [adres]

Açıklama

vmmap, belirtilen bir süreçte ayrılmış olan sanal bellek bölgelerini (virtual memory regions) görüntüleyerek, bir programcının belleğin nasıl kullanıldığını ve belirli bir adresteki belleğin amacının ne olabileceğini anlamasına yardımcı olur.

vmmap bir argüman gerektirir; bu, incelenecek sürecin kimliği (PID), sürecin tam veya kısmi çalıştırılabilir adı ya da leaks veya Xcode Memory Graph Debugger tarafından oluşturulan bir bellek grafiği dosyasının yol adı olabilir.

İsteğe bağlı adres belirtilirse, bilgiler yalnızca o adresi içeren sanal bellek (VM) bölgesi (varsa) ve onun etrafındaki bölgeler için gösterilir.

Seçenekler

-s, -sortBySize Bölgeleri ve malloc alanlarını boyuta (kirli + takas edilmiş / dirty + swapped) göre sıralayarak yazdırır.

  • -w, -wide: Eşlenmiş dosyaların tam yollarını göstermek amacıyla geniş çıktı yazdırır.

  • -v, -verbose: -w -submap -allSplitLibs -noCoalesce seçenekleri ile eşdeğerdir.

  • -attributes: Desteklendiği şekilde JIT, TPRO ve ek nitelikler dahil olmak üzere uygulanan bölge niteliklerini görüntüler.

  • -pages: Bölge boyutlarını bayt yerine sayfa sayısı olarak yazdırır.

  • -interleaved: Tüm yazılabilir olmayan bölgeleri ve ardından tüm yazılabilir bölgeleri yapmak yerine, tüm bölgeleri başlangıç adresine göre artan sırada yazdırır.

  • -submap: Sanal bellek alt haritaları (VM submaps) hakkında bilgi yazdırır.

  • -allSplitLibs: Bu süreç tarafından yüklenmemiş olsalar bile, tüm paylaşılan sistem ayrık kitaplıkları (shared system split libraries) hakkında bilgi yazdırır.

  • -noCoalesce: Bitişik ve özdeş bölgeleri birleştirmez (coalesce). Varsayılan davranış, daha kısa bir çıktı için bunları birleştirmektir.

  • -summary: Bireysel bölge ayrıntılarını değil, yalnızca sanal bellek kullanımının özetini yazdırır.

Çıktının Açıklaması

vmmap her bir bölge için başlangıç adresini, bitiş adresini, bölge boyutunu (kilobayt veya sayfa cinsinden), sayfa için okuma/yazma izinlerini, sayfa için paylaşım modunu ve sayfaların amacını açıklar.

Sanal bellek bölgesinin boyutu, ayrılmış olan sanal bellek sayfalarını temsil eder ancak bunların mutlaka fiziksel olarak tahsis edildiği anlamına gelmez. Örneğin, vm_allocate Mach sistem çağrısını kullanmak sayfaları rezerve eder, ancak belleğe fiilen erişilene kadar o sayfa için fiziksel bellek tahsis edilmez. Belleğe eşlenmiş bir dosyanın rezerve edilmiş bir sanal bellek sayfası olabilir, ancak bir okuma veya yazma işlemi gerçekleşene kadar sayfalar somutlaştırılmaz. Bu nedenle, bu boyut uygulamanın gerçek bellek kullanımını doğru şekilde tanımlamayabilir.

Varsayılan olarak boyutlar kilobayt veya megabayt cinsinden gösterilir. Eğer -pages bayrağı verilmişse boyutlar sanal bellek sayfası sayısı cinsindendir.

Koruma modu (protection mode), belleğin okunabilir, yazılabilir veya çalıştırılabilir olup olmadığını tanımlar. Her sanal bellek bölgesinin geçerli bir izni ve maksimum bir izni vardır. Bir sanal bellek bölgesi satırında, önce geçerli izin, ikinci olarak maksimum izin görüntülenir. Örneğin, bir uygulamanın ilk sayfası (0x00000000 adresinden başlayan) ne okumaya, ne yazmaya ne de yürütmeye izin verir ("---"). Bu, 0 adresine yapılacak herhangi bir okuma veya yazmanın ya da bir NULL göstericinin başvurusunun çözülmesinin (dereferencing) anında bir veri yolu hatasına (bus error) neden olmasını sağlar. Çalıştırılabilir bir dosyayı temsil eden sayfaların her zaman yürütme ve okuma bitleri ayarlıdır ("r-x"). Geçerli izinler genellikle bölgeye yazılmasına izin vermez. Ancak hata ayıklayıcının (debugger) kesme noktaları eklemek amacıyla bir sayfaya yazma erişimi talep edebilmesi için maksimum izinler yazmaya izin verir. Çalıştırılabilir dosyalar için izinler, bu izinleri belirtmek üzere "r-x/rwx" şeklinde görünür.

Paylaşım modu (share mode), sayfaların süreçler arasında paylaşılıp paylaşılmadığını ve sayfalar değiştirildiğinde ne olduğunu açıklar. Özel sayfalar (PRV), yalnızca bu süreç tarafından görülebilen sayfalardır. Üzerlerine yazıldıkça tahsis edilirler ve diske sayfalabilirler. Yazarken kopyala (Copy-on-write - COW) sayfaları birden fazla süreç tarafından paylaşılır (veya tek bir süreç tarafından birden fazla konumda paylaşılır). Sayfa değiştirildiğinde, yazan süreç sayfanın kendi özel kopyasını alır. Boş (NUL) paylaşım, sayfanın fiziksel bellekte gerçekten var olmadığını gösterir. Diğer ad verilmiş (ALI) ve paylaşılan (SHM) bellek, süreçler arasında paylaşılır.

Paylaşım modu genellikle bölgeyi kontrol eden genel modu tanımlar. Örneğin, yazarken kopyala sayfaları değiştirildikçe uygulama için özel (private) hale gelirler. Özel sayfalar olsa bile, tüm sayfalar özel olana kadar bölge hala COW olarak kalır. Tüm sayfalar özel hale geldiğinde paylaşım modu özel (private) olarak değişir.

En soldaki sütun belleğin amacını belirtir: malloc bölgeleri, yığın (stack), text veya data kesimi vb. İkililerden (binaries) yüklenen bölgeler için en sağ taraf belleğe yüklenen kitaplığı gösterir.

-submaps bayrağı verilmişse, vmmap çıktısı alt haritaların (submaps) açıklamalarını da içerir. Bir alt harita, işletim sisteminin birden fazla süreç arasında yeniden kullanabileceği sanal bellek sayfası açıklamalarından oluşan paylaşılan bir kümedir. Alt haritalar, sanal bellek bölgelerini yalnızca bir kez temsil ederek işletim sisteminin bellek kullanımını en aza indirir. Alt haritalar tüm süreçler tarafından paylaşılabilir (makine genelinde) veya sürece özel (yalnızca süreç için) olabilir. (Alt haritaların nerede bulunduğunu anlamak çoğu geliştirici için önemsizdir ancak sanal bellek sisteminin düşük seviyeleriyle çalışan herkes için ilginç olabilir.)

Örneğin, bir alt harita en yaygın dinamik kitaplıkların salt okunur bölümlerini içerir. Bu kitaplıklara sistemdeki çoğu program ihtiyaç duyar ve salt okunur oldukları için asla değiştirilmezler. Sonuç olarak işletim sistemi bu sayfaları tüm süreçler arasında paylaşır ve her süreçte bu belleğin nasıl düzenlendiğini açıklamak için yalnızca tek bir veri yapısı oluşturmaya ihtiyaç duyar.

Bu bellek bölümü "ayrık kitaplık bölgesi" (split library region) olarak adlandırılır ve sistem genelinde paylaştırılır. Dolayısıyla, teknik olarak o bölgeye yüklenmiş olan tüm dinamik kitaplıklar, bazı süreçler bu kitaplıklardan bazılarını kullanmıyor olsa bile her sürecin VM haritasında bulunur. Varsayılan olarak vmmap, yalnızca belirtilen hedef sürece yüklenmiş olan paylaşılan sistem ayrık kitaplıklarını gösterir. Eğer -allSplitLibs bayrağı verilirse, belirtilen hedef sürece yüklenip yüklenmediklerine bakılmaksızın tüm paylaşılan sistem ayrık kitaplıkları hakkında bilgi yazdırılacaktır.

Makine genelindeki bir alt haritanın içeriği değiştirilirse (örneğin hata ayıklayıcı, hata ayıklama tuzakları yerleştirebilmek için bir dylib bellek bölümünü yazılabilir hale getirirse), alt harita yerel hale gelir ve çekirdek (kernel) ek kopyayı depolamak için bellek tahsis edecektir.

MALLOC ZONE özetindeki % FRAG (parçalanma) aşağıdaki yöntemle hesaplanır:

% FRAG = 100 - (100 * Allocated / (Dirty + Swapped))

Dirty (kirli) ve swapped (takas edilmiş) bellek, süreç tarafından üzerine yazılmış olan bellektir. Allocated (tahsis edilen), malloc'tan şu anda tahsis edilmiş olan bayt sayısıdır.

Ayrıca Bkz.

heap(1), leaks(1), malloc_history(1), stringdups(1), lsof(8)

heap, leaks ve malloc_history komutları, bir sürecin bellek kullanımının çeşitli yönlerine bakmak için kullanılabilir.

lsof komutu, bir veya daha fazla süreçteki açık ve eşlenmiş dosyaların listesini almak için kullanılabilir; bu, örneğin bir birimin neden çıkarılamadığını veya eject edilemediğini belirlemeye yardımcı olabilir.

Xcode geliştirici araçları, vmmap tarafından sağlanana benzer bilgiler verebilen grafiksel bir uygulama olan Instruments aracını da içerir. Allocations aracı, bir uygulamadaki nesne ve bellek kullanımı (VM tahsisleri dahil) hakkındaki dinamik, gerçek zamanlı bilgileri ve tahsislerin nerede gerçekleştiğine dair geriye dönük izleri (backtraces) grafiksel olarak görüntüler. Allocations şablonundaki VM Tracker aracı, bir süreçteki sanal bellek bölgeleri hakkındaki bilgileri grafiksel olarak görüntüler.

Uyarılar

Tüm bellek boyutları ikili ön ekli birimler cinsinden verilmiştir. Örneğin, "1K" ifadesi 1024 baytı ifade eder.

macOS 26.4 9 Ağustos 2022 macOS 26.4