반응형
- 앱 메모리 (App Memory): 현재 실행 중인 애플리케이션들이 사용하고 있는 메모리 공간입니다.
- 유선 메모리 (Wired Memory): macOS 운영체제가 시스템 작동에 필요한 공간이며, 해당 메모리 공간에는 캐시할 수 없으며 RAM에 유지되어 있어야 하기 때문에 다른 애플리케이션에서 사용할 수 없습니다.
- 압축 된 메모리 (Compressed Memory): 사용 빈도가 낮은 메모리 데이터를 압축하여 저장하는 메모리 공간이며, macOS 시스템에서 메모리 사용량이 많아질 때 macOS 운영체제 시스템은 자동으로 비활성 앱이나 데이터를 압축하여 여유 공간을 확보합니다.
* 사용 가능 한 메모리 공간 영역은 [앱 메모리 공간 (App Memory) + 유선 메모리 (Wired Memory) + 압축 된 메모리 (Compressed Memory)] - 전체 메모리 공간 (Total Memory)으로 구할 수 있습니다.
* macOS 운영체제 시스템에서는 효율적인 메모리 관리를 위하여 위의 메모리 공간들을 유기적으로 작동하여 최적의 성능을 내기위하여 작동합니다.
🗂️ [Swift] macOS 운영체제 시스템 메모리 사용량 가져오기
// MARK: - Enum
public enum SKResourceDataUnitType: Double {
case byte = 1 // 1 Byte
case kiloByte = 1024 // 1024 Byte
case megaByte = 1_048_576 // 1024 * 1024 Byte
case gigaByte = 1_073_741_824 // 1024 * 1024 * 1024 Byte
case teraBtye = 1_099_511_627_776 // 1024 * 1024 * 1024 * 1024 Byte
}
// MARK: - Struct
public struct SKMemoryResourceInfo: Codable {
/// Using Total RAM `[% Percentage]`
public let value: Double
/// Efficiently your memory is serving your processing needs `[% Percentage]`
public let pressureValue: Double
/// The amount of memory being used by apps
public let appValue: Double
/// Memory required by the system to operate. This memory can’t be cached and must stay in RAM, so it’s not available to other apps
public let wiredValue: Double
/// The amount of memory that has been compressed to make more RAM available
public let compressedValue: Double
}
// MARK: - Extension Double
extension Double {
public var round2dp: Double { return (10.0 * self).rounded() / 10.0 }
}
final func getStatistics64() -> vm_statistics64 {
var size: mach_msg_type_number_t = UInt32(MemoryLayout<vm_statistics64_data_t>.size / MemoryLayout<integer_t>.size)
let hostInfo = vm_statistics64_t.allocate(capacity: 1)
let _ = hostInfo.withMemoryRebound(to: integer_t.self, capacity: Int(size)) { (pointer) -> kern_return_t in
return host_statistics64(mach_host_self(), HOST_VM_INFO64, pointer, &size)
}
let data = hostInfo.move()
hostInfo.deallocate()
return data
}
final func getSystemMemoryResource(type: SKResourceDataUnitType = .gigaByte) -> SKMemoryResourceInfo {
let maximumMemory = Double(ProcessInfo.processInfo.physicalMemory) / type.rawValue
let load = getStatistics64()
let unit = Double(vm_kernel_page_size) / type.rawValue
let active = Double(load.active_count) * unit
let speculative = Double(load.speculative_count) * unit
let inactive = Double(load.inactive_count) * unit
let wired = Double(load.wire_count) * unit
let compressed = Double(load.compressor_page_count) * unit
let purgeable = Double(load.purgeable_count) * unit
let external = Double(load.external_page_count) * unit
let using = active + inactive + speculative + wired + compressed - purgeable - external
return SKMemoryResourceInfo(value: min(99.9, (100.0 * using / maximumMemory).round2dp),
pressureValue: (100.0 * (wired + compressed) / maximumMemory).round2dp,
appValue: (using - wired - compressed).round2dp,
wiredValue: wired.round2dp,
compressedValue: compressed.round2dp)
}
🚀 REFERENCE
반응형
댓글