【问题标题】:how to clean RAM programmatically cocoa?如何以编程方式清理 RAM 可可?
【发布时间】: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”是什么意思?
  • 我正在创建一个类似内存清理器的应用程序,所以我想以编程方式进行。

标签: objective-c cocoa


【解决方案1】:

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

【讨论】:

  • @prince 您是否找到了一种解决方案来以我所描述的任何其他方式清理内存?您是否查看过 Mac App Store 中的“Memory Clean”应用并使用 Activity Monitor 检查了它的作用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多