示範中,記憶體資訊所得出的數值並不是絕對的,它會因為裝置內正在執行的程式(包含背景執行)所佔用記憶體的多寡而改變,並不完全等於電腦上所顯示的使用量,另外,如果你是使用模擬器來實作本示範,可以採用工具程式中的活動監視器來做比對,同樣地,比對的數值並也不是絕對的。
在開始前要先引入 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,猜測可能是有限制分配記憶體大小給模擬器的緣故。
沒有留言:
張貼留言