en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

7.13.2012

查詢裝置記憶體資訊的方法


示範中,記憶體資訊所得出的數值並不是絕對的,它會因為裝置內正在執行的程式(包含背景執行)所佔用記憶體的多寡而改變,並不完全等於電腦上所顯示的使用量,另外,如果你是使用模擬器來實作本示範,可以採用工具程式中的活動監視器來做比對,同樣地,比對的數值並也不是絕對的。

在開始前要先引入 mach_host.h 標頭檔,才有辦法取得裝置當前的記憶體使用狀況。
#import <mach/mach_host.h>
在開始取得記憶體的相關資訊前,要先宣告一個 vm_statistics_data_t 的結構,你可以查閱 vm_statistics.h 了解更多有關此結構的內部資訊,以下是 vm_statistics_data_t  結構中所包含的資訊
struct vm_statistics {
    natural_t free_count;      /* # of pages free */
    natural_t active_count;    /* # of pages active */
    natural_t inactive_count;  /* # of pages inactive */
    natural_t wire_count;      /* # of pages wired down */
    natural_t zero_fill_count; /* # of zero fill pages */
    natural_t reactivations;   /* # of pages reactivated */
    natural_t pageins;         /* # of pageins */
    natural_t pageouts;        /* # of pageouts */
    natural_t faults;          /* # of faults */
    natural_t cow_faults;      /* # of copy-on-writes */
    natural_t lookups;         /* object cache lookups */
    natural_t hits;            /* object cache hits */

    /* added for rev1 */
    natural_t purgeable_count; /* # of pages purgeable */
    natural_t purges;          /* # of pages purged */

    /* added for rev2 */
    /*
    * NB: speculative pages are already accounted for in "free_count",
    * so "speculative_count" is the number of "free" pages that are
    * used to hold data that was read speculatively from disk but
    * haven't actually been used by anyone so far.
    */
    natural_t speculative_count; /* # of pages speculative */
};

/* Used by all architectures */
typedef struct vm_statistics *vm_statistics_t;
typedef struct vm_statistics vm_statistics_data_t;

接下來就可以使用下列程式碼來取得記憶體的相關資訊。
vm_statistics_data_t vmStats;
mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;

//將取得的記憶體資訊放入vmStats結構中
kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);

if (kernReturn == KERN_SUCCESS) {
    //成功擷取記憶體資訊

} else {
    //擷取失敗

}

下列程式碼是在成功取得記憶體資訊時的應用,透過 vmStats 結構來獲取想要的資訊。
double free, active, inactive, wiredDown, purgeable, total;

//取得vmStats結構中的資訊並轉換成對應的單位
free      = (vm_page_size *vmStats.free_count) / 1024.0 / 1024.0 /1024.0;
active    = (vm_page_size *vmStats.active_count) / 1024.0 / 1024.0 /1024.0;
inactive  = ((vm_page_size *vmStats.inactive_count))/ 1024.0 / 1024.0 / 1024.0;
wiredDown = (vm_page_size *vmStats.wire_count) / 1024.0 / 1024.0 /1024.0;
purgeable = (vm_page_size *vmStats.purgeable_count) / 1024.0 / 1024.0;

NSLog(@"可用記憶體 :%0.2f (GB)", free);
NSLog(@"現用記憶體 :%0.2f (GB)", active);
NSLog(@"非現用記憶體:%0.2f (GB)", inactive);
NSLog(@"已寫入記憶體:%0.2f (GB)", wiredDown);
NSLog(@"可釋放記憶體:%0.2f (MB)", purgeable);

上述程式碼的執行結果

工具程式中活動監視器的結果


ps:如果要求完整記憶體大小,可以將 free_count、active_count、inactive_count 與 wire_count 的結果累加即可,不過上述的累加的結果絕對不會等於 8.00 GB,猜測可能是有限制分配記憶體大小給模擬器的緣故。






沒有留言:

張貼留言