diff --git a/Sources/ProcessBarMonitor/MonitorViewModel.swift b/Sources/ProcessBarMonitor/MonitorViewModel.swift index 136d07a..c23c47f 100644 --- a/Sources/ProcessBarMonitor/MonitorViewModel.swift +++ b/Sources/ProcessBarMonitor/MonitorViewModel.swift @@ -87,7 +87,7 @@ final class MonitorViewModel: ObservableObject { var menuBarTitle: String { let cpu = String(format: "%.0f%%", summary.cpuPercent) - let memoryUsed = shortMemoryString(bytes: summary.memoryUsedBytes) + let memoryUsed = shortMemoryString(bytes: summary.systemMemoryUsedBytes) let temp = summary.cpuTemperatureC.map { String(format: "%.0f°", $0) } ?? "--°" switch menuBarDisplayMode { diff --git a/Sources/ProcessBarMonitor/Resources/en.lproj/Localizable.strings b/Sources/ProcessBarMonitor/Resources/en.lproj/Localizable.strings index ff6c5b1..76268fa 100644 --- a/Sources/ProcessBarMonitor/Resources/en.lproj/Localizable.strings +++ b/Sources/ProcessBarMonitor/Resources/en.lproj/Localizable.strings @@ -1,5 +1,5 @@ "summary.cpu" = "CPU"; -"summary.ram" = "RAM"; +"summary.ram" = "RAM (System-wide)"; "summary.temp" = "Temp"; "summary.thermal" = "Thermal"; "metric.used_percent" = "%.0f%% used"; diff --git a/Sources/ProcessBarMonitor/Resources/zh-Hans.lproj/Localizable.strings b/Sources/ProcessBarMonitor/Resources/zh-Hans.lproj/Localizable.strings index 3d8e65e..88c1eb6 100644 --- a/Sources/ProcessBarMonitor/Resources/zh-Hans.lproj/Localizable.strings +++ b/Sources/ProcessBarMonitor/Resources/zh-Hans.lproj/Localizable.strings @@ -1,5 +1,5 @@ "summary.cpu" = "CPU"; -"summary.ram" = "内存"; +"summary.ram" = "内存 (系统级)"; "summary.temp" = "温度"; "summary.thermal" = "热状态"; "metric.used_percent" = "已用 %.0f%%"; diff --git a/Sources/ProcessBarMonitor/SystemMetricsProvider.swift b/Sources/ProcessBarMonitor/SystemMetricsProvider.swift index 68f96b7..aa1659f 100644 --- a/Sources/ProcessBarMonitor/SystemMetricsProvider.swift +++ b/Sources/ProcessBarMonitor/SystemMetricsProvider.swift @@ -31,7 +31,8 @@ actor SystemMetricsProvider { return SystemSummary( cpuPercent: cpuUsagePercent(), - memoryUsedBytes: currentUsedMemory(), + systemMemoryUsedBytes: currentUsedMemory(), + appMemoryUsedBytes: currentAppMemoryBytes(), memoryTotalBytes: ProcessInfo.processInfo.physicalMemory, thermalState: ProcessInfo.processInfo.thermalState, cpuTemperatureC: temperature, @@ -40,6 +41,14 @@ actor SystemMetricsProvider { ) } + /// Computes the current app's total RSS across all threads via proc_pidinfo. + private func currentAppMemoryBytes() -> UInt64 { + var info = proc_taskinfo() + let size = proc_pidinfo(getpid(), PROC_PIDTASKINFO, 0, &info, Int32(MemoryLayout.size)) + guard size == Int32(MemoryLayout.size) else { return 0 } + return UInt64(info.pti_resident_size) + } + private func currentUsedMemory() -> UInt64 { var vmStats = vm_statistics64() var count = mach_msg_type_number_t(MemoryLayout.size / MemoryLayout.size) diff --git a/Sources/ProcessBarMonitor/SystemModels.swift b/Sources/ProcessBarMonitor/SystemModels.swift index 86f15f6..73026d8 100644 --- a/Sources/ProcessBarMonitor/SystemModels.swift +++ b/Sources/ProcessBarMonitor/SystemModels.swift @@ -125,7 +125,11 @@ struct MetricPoint: Identifiable, Hashable { struct SystemSummary { let cpuPercent: Double - let memoryUsedBytes: UInt64 + /// System-wide memory pages: active + inactive + wired + compressor. + /// This is the macOS "memory pressure" figure — not per-process RSS. + let systemMemoryUsedBytes: UInt64 + /// Actual RSS of this app's processes, summed across all children. + let appMemoryUsedBytes: UInt64 let memoryTotalBytes: UInt64 let thermalState: ProcessInfo.ThermalState let cpuTemperatureC: Double? @@ -134,12 +138,13 @@ struct SystemSummary { var memoryPressurePercent: Double { guard memoryTotalBytes > 0 else { return 0 } - return (Double(memoryUsedBytes) / Double(memoryTotalBytes)) * 100 + return (Double(systemMemoryUsedBytes) / Double(memoryTotalBytes)) * 100 } static let empty = SystemSummary( cpuPercent: 0, - memoryUsedBytes: 0, + systemMemoryUsedBytes: 0, + appMemoryUsedBytes: 0, memoryTotalBytes: 0, thermalState: .nominal, cpuTemperatureC: nil, diff --git a/Sources/ProcessBarMonitor/Views.swift b/Sources/ProcessBarMonitor/Views.swift index 51ee9a6..eff7677 100644 --- a/Sources/ProcessBarMonitor/Views.swift +++ b/Sources/ProcessBarMonitor/Views.swift @@ -137,7 +137,7 @@ struct MenuBarContentView: View { } private var memorySummary: String { - let used = ByteCountFormatter.string(fromByteCount: Int64(viewModel.summary.memoryUsedBytes), countStyle: .memory) + let used = ByteCountFormatter.string(fromByteCount: Int64(viewModel.summary.systemMemoryUsedBytes), countStyle: .memory) let total = ByteCountFormatter.string(fromByteCount: Int64(viewModel.summary.memoryTotalBytes), countStyle: .memory) return "\(used) / \(total)" }