- 菜单栏:CPU/GPU/内存多样式、网速两行、温度、风扇 - 面板:概览仪表盘、进程、散热、防休眠,液态玻璃与浅色/深色主题 - 采集层:CPU/内存/网络/GPU/磁盘/电池/进程/SMC 温度与风扇,按界面分级采样 - root 辅助工具:风扇调速、合盖不睡眠,断开时自动恢复 - XcodeGen 工程、单元测试、截图模式
43 lines
1.8 KiB
Swift
43 lines
1.8 KiB
Swift
import Darwin
|
|
import Foundation
|
|
|
|
public struct MemorySampler {
|
|
private let total = ProcessInfo.processInfo.physicalMemory
|
|
private let pageSize: UInt64 = {
|
|
var size: vm_size_t = 0
|
|
host_page_size(mach_host_self(), &size)
|
|
return UInt64(size)
|
|
}()
|
|
|
|
public init() {}
|
|
|
|
public func sample() -> MemoryUsage? {
|
|
var stats = vm_statistics64()
|
|
var count = mach_msg_type_number_t(MemoryLayout<vm_statistics64_data_t>.stride / MemoryLayout<integer_t>.stride)
|
|
let kr = withUnsafeMutablePointer(to: &stats) {
|
|
$0.withMemoryRebound(to: integer_t.self, capacity: Int(count)) {
|
|
host_statistics64(mach_host_self(), HOST_VM_INFO64, $0, &count)
|
|
}
|
|
}
|
|
guard kr == KERN_SUCCESS else { return nil }
|
|
|
|
// 与“活动监视器”口径一致:App 内存 = internal - purgeable
|
|
let internalPages = UInt64(stats.internal_page_count)
|
|
let purgeable = UInt64(stats.purgeable_count)
|
|
let app = (internalPages > purgeable ? internalPages - purgeable : 0) * pageSize
|
|
|
|
var swap = xsw_usage()
|
|
var swapSize = MemoryLayout<xsw_usage>.size
|
|
let swapUsed = sysctlbyname("vm.swapusage", &swap, &swapSize, nil, 0) == 0 ? swap.xsu_used : 0
|
|
|
|
let level = Sysctl.int("kern.memorystatus_vm_pressure_level") ?? 1
|
|
return MemoryUsage(total: total,
|
|
app: app,
|
|
wired: UInt64(stats.wire_count) * pageSize,
|
|
compressed: UInt64(stats.compressor_page_count) * pageSize,
|
|
cached: (UInt64(stats.external_page_count) + purgeable) * pageSize,
|
|
swapUsed: swapUsed,
|
|
pressure: MemoryPressure(rawValue: level) ?? .normal)
|
|
}
|
|
}
|