2011-05-23 8 views
11

मैक ओएस एक्स पर, मैं देख सकता हूं कि गतिविधि मॉनीटर में कितनी मेमोरी मुक्त है। मैं प्रोग्रामेटिक तरीके से यह कैसे कर सकता हूं?मैं गतिविधि मॉनिटर की तरह मैक पर प्रोग्राम सिस्टम से मुक्त सिस्टम मेमोरी कैसे देख सकता हूं?

उत्तर

26

ऐसा करना चाहिए। संरचनाओं में खेतों के सटीक अर्थ के लिए Google आस-पास, लेकिन यह इस कोड से बहुत ही आत्म-व्याख्यात्मक कार्य होना चाहिए।

#import <sys/sysctl.h> 
#import <mach/host_info.h> 
#import <mach/mach_host.h> 
#import <mach/task_info.h> 
#import <mach/task.h> 
int mib[6]; 
mib[0] = CTL_HW; 
mib[1] = HW_PAGESIZE; 

int pagesize; 
size_t length; 
length = sizeof (pagesize); 
if (sysctl (mib, 2, &pagesize, &length, NULL, 0) < 0) 
{ 
    fprintf (stderr, "getting page size"); 
} 

mach_msg_type_number_t count = HOST_VM_INFO_COUNT; 

vm_statistics_data_t vmstat; 
if (host_statistics (mach_host_self(), HOST_VM_INFO, (host_info_t) &vmstat, &count) != KERN_SUCCESS) 
{ 
    fprintf (stderr, "Failed to get VM statistics."); 
} 

double total = vmstat.wire_count + vmstat.active_count + vmstat.inactive_count + vmstat.free_count; 
double wired = vmstat.wire_count/total; 
double active = vmstat.active_count/total; 
double inactive = vmstat.inactive_count/total; 
double free = vmstat.free_count/total; 

task_basic_info_64_data_t info; 
unsigned size = sizeof (info); 
task_info (mach_task_self(), TASK_BASIC_INFO_64, (task_info_t) &info, &size); 

double unit = 1024 * 1024; 
memLabel.text = [NSString stringWithFormat: @"% 3.1f MB\n% 3.1f MB\n% 3.1f MB", vmstat.free_count * pagesize/unit, (vmstat.free_count + vmstat.inactive_count) * pagesize/unit, info.resident_size/unit]; 
+1

यह काम करता है! इस शानदार कोड के साथ मेरी मदद करने के लिए धन्यवाद! – backspacer

+1

क्या मैं सही में sysctlbyname का उपयोग कर रहा हूं और आपको #include # शामिल करें markhunte

+3

मैंने उदार उत्तर के लिए उत्तर –

-2

सामान्य आदेशों करने के लिए कि यूनिक्स पर

  • df हैं -h हार्ड ड्राइव उपयोग
  • मुक्त रैम के लिए और स्वैप उपयोग

फिर आप होगा के लिए दी गई जानकारी में से एक निकालने के लिए उनमें से एक या कई का उपयोग करें: एएके, sed, grep, head, cut, ...

नोट: यदि आप "प्रोग्रामेटिक रूप से" मेमोरी की जांच करने की योजना नहीं बनाते हैं, तो मैं आपको सलाह देता हूं कि शीर्ष का उपयोग करें ताकि यह पता चल सके कि कौन सी प्रक्रियाएं आपके सीपीयू और रैम का उपयोग कर रही हैं। जीनोम सिस्टम मॉनीटर इसके जीयूआई समकक्षों में से एक है।

+0

आपके उत्तर के लिए धन्यवाद। मुझे उपयोग करने के लिए "शीर्ष" बहुत आसान लगता है। लेकिन मैं प्रोग्राम को "शीर्ष" कमांड से परिणाम कैसे प्राप्त कर सकता हूं? मैं खोल से संबंधित सामान के लिए बहुत नया हूँ। – backspacer

3

वास्तव में, यह केवल आधा सच है।

मुफ्त मानक यूनिक्स नहीं बल्कि एक लिनक्स-केवल कमांड है। आपको न तो बीएसडी पर मिलेगा, न ही ओएस एक्स पर।

उस मामले के लिए, स्मृति जानकारी प्राप्त करने का एक बेहतर तरीका sysctl के माध्यम से है।

आईई। रन sysctl -a | grep -Ei "(hw|vm)\..*mem"

और आपको यह विचार मिल जाएगा।

इस प्रोग्रामेटिक रूप से सी में उपयोग करने के लिए, मैन sysctlbyname देखें।

इसके अलावा, मैं, हालांकि नहीं दिख रहा है कि कैसे सूक्ति सिस्टम मॉनिटर OS X पर मदद करता है

df एक अच्छा संकेत है।

यदि आप केवल उन डेटा को इकट्ठा करने और शीर्ष पर चयन करने के लिए खोल का उपयोग करने की योजना बना रहे हैं, तो मैन शीर्ष पढ़ें। आप केवल एक नमूना प्राप्त करने के लिए -l 1 के साथ शीर्ष पर आ सकते हैं और 20 प्रक्रियाओं के साथ प्रक्रिया प्रक्रिया को सीमित कर सकते हैं। 2 ध्यान रखें कि आपको केवल नमूना का उपयोग करके प्रोसेस के लिए CPU मान नहीं मिलेगा, कारण है मैन पेज में उल्लिखित।

top -l1 -n 20 | grep -Ei "mem|vm"

आशा है कि मदद करता है:

एक साधारण उदाहरण कुछ (केवल पूर्ण लाइनों) शीर्ष से बाहर स्मृति के बारे में जानकारी प्राप्त करने के लिए।

+0

'vm_stat' शायद' sysctl' से बेहतर विकल्प है। –

संबंधित मुद्दे