2015-11-02 3 views
0

В ОЗУ, имеющем четыре типа (проводная память, активная память, неактивная память, свободная память)Как очистить RAM программно какао?

Я получил значение этой памяти четырех типов. но я хочу очистить RAM. как можно очистить RAM программно в объективе-c?

вот часть кода:

#import <sys/sysctl.h> 
#import <mach/host_info.h> 
#import <mach/mach_host.h> 
#import <mach/task_info.h> 
#import <mach/task.h> 
#import "AppDelegate.h" 




@interface AppDelegate() 

@property (weak) IBOutlet NSWindow *window; 
@property (weak) IBOutlet NSView *myview ,*view2; 

@end 

@implementation AppDelegate 
@synthesize myview; 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    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; 
    // 
    // NSString *resultstring = [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]; NSLog(@"%fGB",total); 


    NSLog(@"Free :% 3.1fMB",vmstat.free_count * pagesize/unit); 
    NSLog(@"wired :% 3.1fMB",vmstat.wire_count * pagesize/unit); 
    NSLog(@"active :% 3.1fMB",vmstat.active_count * pagesize/unit); 
    NSLog(@"inactive :% 3.1fMB",vmstat.inactive_count * pagesize/unit); 
} 
+2

Почему вы хотите это сделать? Большая часть этой памяти может быть очищена только путем уничтожения всех остальных процессов, запущенных в системе. Это не очень практично. Большинство оставшихся будет использоваться кэшами ОС, и вы не можете сделать это, чтобы повлиять на них, даже если у вас есть веские основания для этого. – Avi

+1

Если ваш процесс является корневым, то 'execl ("/sbin/shutdown "," shutdown "," now ");' очистит всю RAM для вас. Если вы ищете что-то еще, что вы подразумеваете под «четкой оперативной памятью»? –

+0

Я создаю приложение, подобное очистке памяти, поэтому я хочу делать программно. –

ответ

0

реализовать приложение, как уборщика памяти: только Alloc столько памяти, сколько это возможно. другие приложения получат уведомления о давлении на память, а OS X попытается освободить столько же для вашего приложения. вы затем освобождаете только что выделенную память, оставляя свободную память.

+0

@prince вы нашли решение для чистки памяти любым другим способом, чем я описал? Вы посмотрели приложение «Memory Clean» из Mac App Store и проверили с Activity Monitor, что он делает? –

Смежные вопросы