package collector import ( "strconv" ) type MemoryInfo struct { TotalBytes int64 `json:"total_bytes"` UsedBytes int64 `json:"used_bytes"` FreeBytes int64 `json:"free_bytes"` } func CollectMemory() MemoryInfo { info := MemoryInfo{} // Gesamter physischer Speicher if v, err := strconv.ParseInt(sysctlGet("hw.physmem"), 10, 64); err == nil { info.TotalBytes = v } // Freier Speicher berechnen via vm.stats.vm pageSize := int64(4096) if v, err := strconv.ParseInt(sysctlGet("hw.pagesize"), 10, 64); err == nil && v > 0 { pageSize = v } // Freie + inactive + cache Pages freePages, _ := strconv.ParseInt(sysctlGet("vm.stats.vm.v_free_count"), 10, 64) inactivePages, _ := strconv.ParseInt(sysctlGet("vm.stats.vm.v_inactive_count"), 10, 64) info.FreeBytes = (freePages + inactivePages) * pageSize info.UsedBytes = info.TotalBytes - info.FreeBytes if info.UsedBytes < 0 { info.UsedBytes = 0 } if info.FreeBytes < 0 { info.FreeBytes = 0 } return info }