- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试了解有关内存使用情况的详细信息,以及如何使用 C++ 对其进行测量。我知道在 Windows 下,当包含 <Windows.h>
时,有一种快速检索当前应用程序进程使用的 RAM 量的方法。 , 是:
PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
(uint64_t)info.WorkingSetSize;
然后,我用它来运行一个非常简单的测试:
#include <iostream>
#include <Windows.h>"
int main(void)
{
uint64_t currentUsedRAM(0);
PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize;
const int N(1000000);
int x[N]; //in the second run, comment this line out
int y[N]; //in the second run, comment this line out
//int *x = new int[N]; //in the second run UNcomment this line out
//int *y = new int[N]; //in the second run UNcomment this line out
for (int i = 0; i < N; i++)
{
x[i] = 1;
y[i] = 2;
}
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize - currentUsedRAM;
std::cout << "Current RAM used: " << currentUsedRAM << "\n";
return 0;
}
当我运行上面的代码时,我完全不明白,输出是:Current RAM used: 0
,而自从我填充了两个 1D int
后,我期待大约 8mb 的东西。每个数组包含 100 万个条目。现在,如果我重新运行代码但生成 x
和 y
成为动态分配的数组,现在输出如预期的那样:Current RAM used: 8007680
.
这是为什么呢?如何让它在这两种情况下检测内存使用情况?
最佳答案
编译器已经优化了你的代码。事实上,对于您的第一次运行,既没有分配 x 也没有分配 y。考虑到有明显的副作用:GetProcessMemoryInfo 的返回值,这种优化似乎有点奇怪。
无论如何,您可以通过添加一些其他副作用来防止这种情况发生,例如输出这两个数组的每个元素的总和,这将保证崩溃。
为具有自动存储持续时间的本地对象分配内存发生at the beginning of the enclosing code block and deallocated at the end 。因此,您的代码无法测量 main 中任何自动存储持续时间变量的内存使用情况(也无法测量我删除的代码片段,我不知道)。但是对于那些具有动态存储持续时间的对象来说情况不同,它们是根据请求分配的。
我设计了一个涉及回避评论区讨论的测试。如果程序更深入,您可以看到内存使用量增加了。这证明它计算了堆栈上的内存使用情况。顺便说一句,它不是计算你的对象需要多少内存,而是计算你的程序需要多少内存。
void foo(int depth, int *a, int *b, uint64_t usage) {
if (depth >= 100)
return ;
int x[100], y[100];
for (int i = 0; i < 100; i++)
{
x[i] = 1 + (a==nullptr?0:a[i]);
y[i] = 2 + (b==nullptr?0:b[i]);
}
PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
std::cout << "Current RAM used: " << info.WorkingSetSize - usage << "\n";
foo(depth+1,x,y,usage);
int sum = 0;
for (int i=0; i<100; i++)
sum += x[i] + y[i];
std::cout << sum << std::endl;
}
int main(void)
{
uint64_t currentUsedRAM(0);
PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize;
foo(0, nullptr, nullptr, currentUsedRAM);
return 0;
}
/*
Current RAM used: 0
Current RAM used: 61440
Current RAM used: 65536
Current RAM used: 65536
Current RAM used: 65536
Current RAM used: 65536
Current RAM used: 69632
Current RAM used: 69632
Current RAM used: 69632
Current RAM used: 69632
Current RAM used: 69632
Current RAM used: 73728
*/
系统每次分配4k,一个page的大小。我不知道为什么它会变成 0,然后突然变成 61440。解释 Windows 如何管理内存非常困难,而且远远超出了我的能力,尽管我对 4k 的事情很有信心……而且它确实计算了内存使用量对于具有自动存储持续时间的变量。
关于c++ - 无法使用 GetProcessMemoryInfo 测量静态数组内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42852742/
我在 C++ 中使用 psapi.h 编写用于查找当前进程的虚拟内存的代码我的代码如下 #include "windows.h" #include "psapi.h" PROCESS_MEMORY_C
在我的应用程序中,我试图使用下面提到的 API 计算 Windows 计算机中特定进程的内存利用率。 GetProcessMemoryInfo(hProcess, &info, sizeof(info
我正在尝试了解有关内存使用情况的详细信息,以及如何使用 C++ 对其进行测量。我知道在 Windows 下,当包含 时,有一种快速检索当前应用程序进程使用的 RAM 量的方法。 , 是: PROCE
我正在尝试在 Windows 7 32 位的 C++ 应用程序中使用 psapi.h 的函数 GetProcessMemoryInfo。 我按照一些教程做了一些类似的事情: PPROCESS_MEMO
我的 Delphi XE 应用程序基于单个 EXE,使用由 RemObjects 创建的本地服务器 DLL,并使用大量内存进行特定操作,直到生成一个异常,指出内存不足。因此,我试图了解发生这种情况的原
我正在尝试使用 C++ 获取系统中运行的进程列表。我使用 Windows API 中可用的函数(如 OpenProcess 和 CreateToolhelp32Snapshot )来完成它。 问题是该
我有这个问题,无法在这个测试代码上得到解决。 无效参数候选人是: ? GetProcessMemoryInfo(?, _PROCESS_MEMORY_COUNTERS *, ?) How to det
我正在使用 GetProcessMemoryInfo 函数通过其 PID 确定进程内存使用情况。 使用常规 PROCESS_MEMORY_COUNTERS 一切正常,但我需要 PrivateUsage
我正在尝试使用 C 语言在 Windows 上计算当前进程的主内存使用情况: Windows .hpsapi.h PROCESS_MEMORY_COUNTERS_EX pmc; GetProcessM
我是一名优秀的程序员,十分优秀!