如何以编程方式清理 RAM 可可?

Posted

技术标签:

【中文标题】如何以编程方式清理 RAM 可可?【英文标题】:how to clean RAM programmatically cocoa? 【发布时间】:2015-11-02 12:07:14 【问题描述】:

在RAM中,有四种类型(有线内存、活动内存、非活动内存、空闲内存)

我已经获取了这四种类型内存的值。但我想通过清除内存。如何在 Objective-c 中以编程方式清除 RAM?

这里是一些代码:

#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);

【问题讨论】:

为什么要这样做?大部分内存只能通过杀死系统上运行的所有其他进程来清除。这不是一件很实际的事情。其余大部分将由操作系统缓存使用,即使您有正当理由这样做,您也无能为力。 如果您的进程是root,那么execl("/sbin/shutdown", "shutdown", "now"); 将为您清除所有RAM。如果您正在寻找其他东西,“清除 RAM”是什么意思? 我正在创建一个类似内存清理器的应用程序,所以我想以编程方式进行。 【参考方案1】:

实现像内存清理器这样的应用:分配尽可能多的内存。其他应用程序将收到内存压力通知,OS X 将尝试为您的应用程序释放尽可能多的内存。然后释放刚刚分配的内存,留下空闲内存。

【讨论】:

@prince 您是否找到了一种解决方案来以我所描述的任何其他方式清理内存?您是否查看过 Mac App Store 中的“Memory Clean”应用并使用 Activity Monitor 检查了它的作用?

以上是关于如何以编程方式清理 RAM 可可?的主要内容,如果未能解决你的问题,请参考以下文章

在可可触摸中以编程方式将视图位置设置为右上角

如何以编程方式将空间添加到任务控制?

如何以编程方式设置 UINavigationbar 的背景颜色?

以编程方式清理 UI 的实现

使用 devenv 以编程方式清理解决方案

以编程方式绑定一个 NSTableView