- 总内存:系统中实际的物理内存大小。
- 已用内存:已经被进程占用的内存。
- 空闲内存:尚未使用的物理内存。
- 交换分区(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 清理缓存,但要谨慎使用,避免影响系统性能。
- 调整交换分区大小:如果物理内存不足且频繁使用交换分区,可以增加交换分区的大小或增加物理内存。
- 优化内存使用:程序优化时应注意防止内存泄漏,确保释放不再使用的内存。