主要指标

  • 总内存:系统中实际的物理内存大小。
  • 已用内存:已经被进程占用的内存。
  • 空闲内存:尚未使用的物理内存。
  • 交换分区(Swap):当物理内存不足时,系统会将不常用的数据移到硬盘上的交换分区。过多使用交换空间会降低系统性能。
  • 缓存与缓冲:缓存用于存储文件系统数据,缓冲用于存储即将写入磁盘的数据。
#include <fstream>
#include <iostream>
#include <string>
#include <sys/sysctl.h>
#include <sys/types.h>

#ifdef __APPLE__
#include <mach/mach.h> // macOS specific
#endif

void getMemoryUsage() {
#ifdef __linux__
  std::ifstream file("/proc/meminfo");
  std::string line;
  long total_memory = 0;
  long free_memory = 0;

  if (file.is_open()) {
    while (std::getline(file, line)) {
      if (line.find("MemTotal:") == 0) {
        sscanf(line.c_str(), "MemTotal: %ld kB", &total_memory);
      }
      if (line.find("MemFree:") == 0) {
        sscanf(line.c_str(), "MemFree: %ld kB", &free_memory);
      }
    }
    file.close();

    std::cout << "Total Memory (Linux): " << total_memory / 1024 << " MB"
              << std::endl;
    std::cout << "Free Memory (Linux): " << free_memory / 1024 << " MB"
              << std::endl;
    std::cout << "Used Memory (Linux): " << (total_memory - free_memory) / 1024
              << " MB" << std::endl;
  }
#elif __APPLE__
  int64_t total_memory = 0;
  int mib[2] = {CTL_HW, HW_MEMSIZE}; // MacOS uses HW_MEMSIZE for total memory
  size_t length = sizeof(total_memory);
  if (sysctl(mib, 2, &total_memory, &length, NULL, 0) == 0) {
    vm_size_t page_size;
    mach_port_t mach_port = mach_host_self();
    mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
    vm_statistics64_data_t vm_stats;

    if (host_page_size(mach_port, &page_size) == KERN_SUCCESS &&
        host_statistics64(mach_port, HOST_VM_INFO, (host_info64_t)&vm_stats,
                          &count) == KERN_SUCCESS) {
      long long free_memory = (int64_t)vm_stats.free_count * (int64_t)page_size;
      long long used_memory = total_memory - free_memory;

      std::cout << "Total Memory (macOS): " << total_memory / (1024 * 1024)
                << " MB" << std::endl;
      std::cout << "Free Memory (macOS): " << free_memory / (1024 * 1024)
                << " MB" << std::endl;
      std::cout << "Used Memory (macOS): " << used_memory / (1024 * 1024)
                << " MB" << std::endl;
    }
  }
#endif
}

int main() {
  getMemoryUsage();
  return 0;
}

命令行工具

  • free:查看内存使用情况,包括物理内存和交换内存。
    • 优化分析:通过 free 可以了解物理内存和交换空间的使用情况,如果交换分区的使用较多,可能需要增加物理内存或优化内存管理。
  • vmstat:显示系统的虚拟内存使用、IO 负载、CPU 等。
    • 优化分析:通过 vmstat 可以了解内存分配和交换区的使用情况,帮助判断是否需要调整应用程序的内存使用。
  • top / htop:显示占用内存最多的进程。
    • 优化分析:通过 top 查看内存消耗大户,识别内存泄漏或不必要的内存占用。

优化方案

  • 释放缓存:通过执行 echo 3 > /proc/sys/vm/drop_caches 清理缓存,但要谨慎使用,避免影响系统性能。
  • 调整交换分区大小:如果物理内存不足且频繁使用交换分区,可以增加交换分区的大小或增加物理内存。
  • 优化内存使用:程序优化时应注意防止内存泄漏,确保释放不再使用的内存。