求内存利用情况
2016-03-17 15:09
337 查看
getMem.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <elatypes.h>
#include <stdarg.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <unistd.h>
#ifdef _MSVC
#include <io.h>
#include <direct.h>
#endif
enum Status_Type {
Status_Type_VmHWM = 1, //占用的物理内存最大值
Status_Type_VmRSS = 2, //当前占用的物理内存值
Status_Type_Thread = 4,//线程数
Status_Type_File = 8,//文件数
Status_Type_ALL = 15
};
typedef struct {
int HWM;
int RSS;
int Threads;
int Files;
} Status_Info;
int getMemoryInfo(Status_Type type, const char *procName, Status_Info *pResult = NULL);
getMen.cpp
int getMemoryInfoById(Status_Type type, int procId, Status_Info *pResult)
{
#ifdef _linux
Boolean bVmHWM = false;
Boolean bVmRSS = false;
Boolean bThread = false;
if (type & Status_Type_VmHWM) bVmHWM = true;
if (type & Status_Type_VmRSS) bVmRSS = true;
if (type & Status_Type_Thread) bThread = true;
char szFileName[256];
snprintf(szFileName, 256, "/proc/%d/status", procId);
FILE *fp = NULL;
fp = fopen(szFileName, "r");
if (NULL == fp) {
printf("Failed to fopen %s\n", szFileName);
return -1;
}
printf("Proc :%d\n", procId);
char szLine[260];
int id = -1;
for (;;) {
if (NULL != fgets(szLine, 260, fp)) {
if (bVmHWM && strstr(szLine, "VmHWM:")) {
char *p = strchr(szLine, ' ');
id = atoi(p);
printf("VmHWM = %d\n", id);
bVmHWM = false;
if (pResult) {
pResult->HWM += id;
}
continue;
}
if (bVmRSS && strstr(szLine, "VmRSS:")) {
char *p = strchr(szLine, ' ');
id = atoi(p);
printf("VmRSS = %d\n", id);
bVmRSS = false;
if (pResult) {
pResult->RSS += id;
}
continue;
}
if (bThread && strstr(szLine, "Threads:")) {
char *p = strchr(szLine, '\t');
id = atoi(p);
printf("Threads = %d\n", id);
bThread = false;
if (pResult) {
pResult->Threads += id;
}
continue;
}
}
else break;
}
fclose(fp);
pResult->Files += getOpenFileCount(procId);
return id;
#else
return 0;
#endif
}
int getMemoryInfo(Status_Type type, const char *procName, Status_Info *pResult)
{
#ifdef _linux
int procId[20] = {0};
find_pid_by_name(procName, procId);
memset(pResult, 0, sizeof(Status_Info));
for (int i = 0; procId[i] != 0; i++) {
getMemoryInfoById(type, procId[i], pResult);
}
XLOG(1, "----------Total-----------\n");
XLOG(1, "VmHWM = %d\n", pResult->HWM);
XLOG(1, "VmRSS = %d\n", pResult->RSS);
XLOG(1, "Threads = %d\n", pResult->Threads);
XLOG(1, "Openfiles = %d\n", pResult->Files);
#else
pResult->HWM = 0;
pResult->RSS = 0;
pResult->Threads = 0;
pResult->Files = 0;
#endif
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <elatypes.h>
#include <stdarg.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <unistd.h>
#ifdef _MSVC
#include <io.h>
#include <direct.h>
#endif
enum Status_Type {
Status_Type_VmHWM = 1, //占用的物理内存最大值
Status_Type_VmRSS = 2, //当前占用的物理内存值
Status_Type_Thread = 4,//线程数
Status_Type_File = 8,//文件数
Status_Type_ALL = 15
};
typedef struct {
int HWM;
int RSS;
int Threads;
int Files;
} Status_Info;
int getMemoryInfo(Status_Type type, const char *procName, Status_Info *pResult = NULL);
getMen.cpp
int getMemoryInfoById(Status_Type type, int procId, Status_Info *pResult)
{
#ifdef _linux
Boolean bVmHWM = false;
Boolean bVmRSS = false;
Boolean bThread = false;
if (type & Status_Type_VmHWM) bVmHWM = true;
if (type & Status_Type_VmRSS) bVmRSS = true;
if (type & Status_Type_Thread) bThread = true;
char szFileName[256];
snprintf(szFileName, 256, "/proc/%d/status", procId);
FILE *fp = NULL;
fp = fopen(szFileName, "r");
if (NULL == fp) {
printf("Failed to fopen %s\n", szFileName);
return -1;
}
printf("Proc :%d\n", procId);
char szLine[260];
int id = -1;
for (;;) {
if (NULL != fgets(szLine, 260, fp)) {
if (bVmHWM && strstr(szLine, "VmHWM:")) {
char *p = strchr(szLine, ' ');
id = atoi(p);
printf("VmHWM = %d\n", id);
bVmHWM = false;
if (pResult) {
pResult->HWM += id;
}
continue;
}
if (bVmRSS && strstr(szLine, "VmRSS:")) {
char *p = strchr(szLine, ' ');
id = atoi(p);
printf("VmRSS = %d\n", id);
bVmRSS = false;
if (pResult) {
pResult->RSS += id;
}
continue;
}
if (bThread && strstr(szLine, "Threads:")) {
char *p = strchr(szLine, '\t');
id = atoi(p);
printf("Threads = %d\n", id);
bThread = false;
if (pResult) {
pResult->Threads += id;
}
continue;
}
}
else break;
}
fclose(fp);
pResult->Files += getOpenFileCount(procId);
return id;
#else
return 0;
#endif
}
int getMemoryInfo(Status_Type type, const char *procName, Status_Info *pResult)
{
#ifdef _linux
int procId[20] = {0};
find_pid_by_name(procName, procId);
memset(pResult, 0, sizeof(Status_Info));
for (int i = 0; procId[i] != 0; i++) {
getMemoryInfoById(type, procId[i], pResult);
}
XLOG(1, "----------Total-----------\n");
XLOG(1, "VmHWM = %d\n", pResult->HWM);
XLOG(1, "VmRSS = %d\n", pResult->RSS);
XLOG(1, "Threads = %d\n", pResult->Threads);
XLOG(1, "Openfiles = %d\n", pResult->Files);
#else
pResult->HWM = 0;
pResult->RSS = 0;
pResult->Threads = 0;
pResult->Files = 0;
#endif
return 0;
}
相关文章推荐
- 成为Java GC专家(3)
- 搜集opencv学习过程中的问题
- 递归
- 磁盘及文件系统管理(分区,挂载,卸载,信息展示与统计)
- 哈希冲突之开链法
- 当spring 容器初始化完成后执行某个方法
- Java中的集合
- TOMCAT JDBC连接不上MYSQL的常用诊断
- ios 中生成随机数
- 长按事件jquery mobile
- IOS异步获取数据并刷新界面dispatch_async的使用方法
- Spark机器学习读书笔记
- Spring 源码分析(三) —— AOP(六)源码分析与总结
- C++中STL与MFC的关系
- Oracle表空间、段、区和块简述
- 移动端H5页面高清多屏适配方案
- SQLite数据库的锁机制
- 【小镇的技术天梯】Fast-CGI和php-fpm之间的关系
- 【leetcode】Wildcard Matching
- Junit应用代码(读取mysql表数据)