【问题标题】:How to get total used memory如何获取总使用内存
【发布时间】:2017-11-20 17:48:02
【问题描述】:

谁能帮我获取 iPhone 的总已用内存?我正在开发一个应用程序来查找 iPhone 的所有详细信息。我找到了 2-3 篇与此问题相关的帖子,但它们要么使用 Obj-C,要么使用不同的语言/语法。我一直在努力将 obj-c 代码更改为 swift,但在路径的某个地方卡住了。

我正在尝试Available memory for iPhone OS app 但在 Swift 中一切看起来都不同。

mach 的语法也非常困难。任何人都可以提供一些例子和一些解释。我可以从这里获得内存的所有信息https://github.com/Shmoopi/iOS-System-Services/blob/master/System%20Services/Utilities/SSMemoryInfo.m 但由于版权问题,我不能使用其他人的作品。我也不明白那里的任何东西。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    给你。这将以字节为单位打印出已使用的内存。

    var info = mach_task_basic_info()
    var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size)/4
    
    let kerr: kern_return_t = withUnsafeMutablePointer(to: &info) {
        $0.withMemoryRebound(to: integer_t.self, capacity: 1) {
            task_info(mach_task_self_,
                      task_flavor_t(MACH_TASK_BASIC_INFO),
                      $0,
                      &count)
        }
    }
    
    if kerr == KERN_SUCCESS {
        print("Memory in use (in bytes): \(info.resident_size)")
    }
    else {
        print("Error with task_info(): " +
            (String(cString: mach_error_string(kerr), encoding: String.Encoding.ascii) ?? "unknown error"))
    }
    

    【讨论】:

    • 我已经遇到了上述解决方案,但它只提供 30 mb 的输出。我认为它只给出当前应用程序的内存使用情况。但是,我需要获取所有应用程序使用的总内存。
    • @Bikram 你如何使用这个功能。这是我刚刚创建的一个新项目的屏幕截图,其中所有内容都为空,只有这个功能。我现在正在打印 276 MB。 imgur.com/a/G21ic
    • @Ning ya 没错。但是当我使用其他应用程序查看内存使用情况时,它会显示 1555.0 MB。我认为 1555 MB 是正确的,因为 iphone 不能仅在 276 MB 上运行。如果我错了,请纠正我
    【解决方案2】:

    @比克拉姆 您可以使用以下函数来获取系统使用的内存总量-

       func getUsedMemory() {
         var usedMemory: Int64 = 0
                let hostPort: mach_port_t = mach_host_self()
                var host_size: mach_msg_type_number_t = mach_msg_type_number_t(MemoryLayout<vm_statistics_data_t>.stride / MemoryLayout<integer_t>.stride)
                var pagesize:vm_size_t = 0
                host_page_size(hostPort, &pagesize)
                var vmStat: vm_statistics = vm_statistics_data_t()
    
                let status: kern_return_t = withUnsafeMutableBytes(of: &vmStat) {
                    let boundPtr = $0.baseAddress?.bindMemory(to: Int32.self, capacity: MemoryLayout.size(ofValue: vmStat) / MemoryLayout<Int32>.stride)
                    return host_statistics(hostPort, HOST_VM_INFO, boundPtr, &host_size)
                }
                // Now take a look at what we got and compare it against KERN_SUCCESS
                if status == KERN_SUCCESS {
                    usedMemory = (Int64)((vm_size_t)(vmStat.active_count + vmStat.inactive_count + vmStat.wire_count) * pagesize)
                }
                else {
                  log("Failed to get Virtual memory inforor")
                }
       }
    

    【讨论】:

    • 使用代码时出现此错误:Overlapping accesses to 'vmStat', but modification requires exclusive access; consider copying to a local variable 有什么想法吗?
    • 让其他人收到上述警告。你需要为容量创建一个局部变量,所以let capacity = MemoryLayout.size(ofValue: vmStat) / MemoryLayout&lt;Int32&gt;.stride然后在.bindMemory(to: Int32.self, capacity: capacity ).....
    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 2018-08-18
    • 2014-05-05
    • 2011-12-18
    • 1970-01-01
    • 2016-10-02
    • 2010-12-05
    • 2012-05-03
    相关资源
    最近更新 更多