Articles of 内存

内存分配失败,即使有足够的内存

我正在使用Linux(正好是Ubuntu 13.04),目前我有一个问题:为什么内存分配将失败,即使有足够的内存? 我今天写了一个简单的testing应用程序,在运行这个testing应用程序时遇到了这个问题 以下是我用来testing的代码片段: #include <stdio.h> #include <unistd.h> #include <list> #include <vector> #include <strings.h> using namespace std; unsigned short calcrc(unsigned char *ptr, int count) { unsigned short crc; unsigned char i; //high cpu-consumption code //implements CRC algorithm: Cylic //Redundancy code } void* CreateChild(void* param){ vector<unsigned char*> MemoryVector; pid_t PID = fork(); if (PID == 0){ […]

为什么一个内存地址以0x开头?

可能重复: 为什么hex前缀为0x? 内存地址通常被标记为以0x的hex值。 例如: > new.env() <environment: 0x21d36e0> 0x部分是什么意思? 这个符号来自哪里? 有没有其他值可能而不是0x ?

Tomcat进程在交换空间不足后被Linux内核杀死; 不要得到任何JVM OutOfMemory错误

我正在对tomcat服务器进行负载testing。 服务器有10G物理内存和2G交换空间。 堆大小(xms和xmx)之前被设置为3G,并且服务器工作正常。 由于我仍然看到很多空闲的内存,性能不佳,我将堆大小增加到7G,然后再次进行负载testing。 这次我观察到物理内存很快就被吃掉了,系统开始消耗交换空间。 后来,tomcat在用完swap之后崩溃了。 我在启动tomcat时包含了-XX:+HeapDumpOnOutOfMemoryError ,但是我没有得到任何堆转储。 当我检查/var/log/messages ,我看到kernel: Out of memory: Kill process 2259 (java) score 634 or sacrifice child 。 为了提供更多的信息,这里是我从Linux top看到的命令,当堆大小设置为3G和7G xms&xmx = 3G(工作正常): 在启动tomcat之前: Mem: 10129972k total, 1135388k used, 8994584k free, 19832k buffers Swap: 2097144k total, 0k used, 2097144k free, 56008k cached 启动tomcat之后: Mem: 10129972k total, 3468208k used, 6661764k free, […]

读取内存时出现访问冲突

背景 我正在用Visual Studio 2013 Community Edition编写命令行C ++程序。 它通过LDAP连接到Active Directory服务器,并在一些属性(例如:办公地点,部门)中检索唯一值列表。 问题 该程序编译好,但我遇到一个内存访问问题,当我运行它: Unhandled exception at 0x74EDC6B1 (Wldap32.dll) in LdapSearchResultTest1.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC. 这是我第一次使用C ++与外部库,所以我不知道如何甚至接近debugging(通常我为Android写Java)。 我花了一天的更好的时间来看看这个问题,并根据类似问题的答案尝试一些想法,但是我仍然无法解决这个问题。 确切的问题在于这个函数调用的最后一个参数: // Do the search int searchReturnCode = ldap_search_s( ldapSession, &searchBase[0], LDAP_SCOPE_SUBTREE, filter, pAttributes, 0, &pSearchResults); // Error is here 我的代码 我的代码是基于MSDN网站的一个例子,我已经在代码中复制了这个例子。 这是一个certificate这个问题的SSCCE : #include<iostream> #include<Windows.h> #include<Winldap.h> #include<WinBer.h> […]

Memcpy与memset相同

我想用memcpy来测量内存带宽。 我从这个答案修改了代码: 为什么vector化循环没有使用memset来衡量带宽的性能改进 。 问题是memcpy只比memset稍慢,因为我认为memcpy运行速度是内存两倍以上的两倍。 更具体地说,我运行了超过1 GB的数组a和b (分配将calloc )100次,执行以下操作。 operation time(s) —————————– memset(a,0xff,LEN) 3.7 memcpy(a,b,LEN) 3.9 a[j] += b[j] 9.4 memcpy(a,b,LEN) 3.8 请注意, memcpy只比memset慢一点。 a[j] += b[j] (其中j越过[0,LEN) )的操作应该比memcpy长三倍,因为它操作的数据量是三倍。 但是它只有memset 2.5左右。 然后我用memset(b,0,LEN)将b初始化为零并再次testing: operation time(s) —————————– memcpy(a,b,LEN) 8.2 a[j] += b[j] 11.5 现在我们看到, memcpy大约是memset两倍, a[j] += b[j]大约是memset三倍。 至less我会预期,在memset(b,0,LEN) , memcpy会比较慢,因为 100次迭代中的第一次迭代的延迟分配(第一次触发) 。 为什么我只能在memset(b,0,LEN)之后得到预期的时间? test.c的 #include <time.h> […]

CUDA和固定(页面locking)内存不是页面locking?

我试图弄清楚CUDA(或OpenCL实现)是否在需要固定(页面locking)的内存时说实话。 我试着cudaMallocHost并看着/proc/meminfo值Mlocked和Unevictable ,都停留在0,永远不会( /proc/<pid>/status报告VmLck也为0)。 我用mlock来locking页面内存,并按照预期值上升。 所以这种行为的两个可能的原因可能是: 我没有从CUDA API获取页面locking内存,并且cudaSuccess是假的 CUDA绕过了页面locking内存的操作系统计数器,因为CUDA在Linux内核方面有一些神奇的function 所以实际的问题是:当我使用CUDA分配页面locking内存时,为什么我无法从操作系统获取页面locking内存的值? 另外:如果不是从/proc/meminfo或/proc/<pid>/status我可以在哪里得到正确的值? 谢谢! 系统:Ubuntu 14.04.01 LTS; CUDA 6.5; Nvidida Driver 340.29; Nvidia Tesla K20c

Linux中C ++应用程序的内存稳定性

我想validation我为Linux编写和编译的C ++应用程序的内存稳定性。 这是一个networking应用程序,以每秒10-20个连接的速度响应远程客户端连接。 从长远来看,内存是上升到50MB,尽pipe该应用程序正在打电话删除… 调查显示,Linux不会立即释放内存。 所以这是我的问题: 如何强制Linux释放我实际释放的内存? 至less我想这样做一次来validation内存的稳定性。 否则,有没有可靠的内存指示器可以报告内存我的应用程序实际上是持有?

当加载/清除大量的数据时,std :: vector会变得越来越慢

问题 我有一个相当复杂的image processing应用程序,其中一个子模块需要将巨大的二进制位图加载到内存中。 实际上高达96 GB(意思是888 888 x 888 888像素的图像)。 磁盘是2xSSD raid0,读写速度约为1 GB / s。 它将图像加载到智能指针向量(每个元素表示8个像素)的向量中(每个元素表示一个位图中的一行)。 这里的一个奇怪的问题是,在重复加载和清除向量之后(我发现内存实际上是没有内存泄漏的填充和清除),每次迭代似乎花费的时间越来越长。 特别清理记忆需要很长时间。 testing 我做了一些简单的testing应用程序来testing这个孤立的,从不同的angular度。 用原始指针代替智能指针给了同样奇怪的行为。 然后,我试图使用本地数组而不是vector,并做了诀窍。 使用向量后,100次迭代的载入/清除24 GB时间急剧增加,而arrays实现时间稳定。 下面是testing应用程序填充内存与24 GB的垃圾,而不是加载一个实际的图像,具有相同的结果。 在Windows 10 Pro上使用128 GB RAM进行testing,并使用Visual Studio 2013 Update 5进行构build。 这个函数使用vector来加载/清除: void SimpleLoadAndClear_Vector(int width, int height) { time_t start_time, end_time; // Load memory time(&start_time); cout << "Loading image into memory…"; auto […]

这些内存区域来自Linux进程?

我发现我的一个进程(~90个线程)使用> 8G内存,我不认为它需要这么大。 因此,我读了/proc/{pid}/maps , /proc/{pid}/smaps和pstack {pid} 。 我想知道这些大型的63M + 508K地区是如何来的,以及它们是怎样的,我可以通过某种方式削弱我的内存使用量吗? 我发现这些地区几乎分为三类: 4xxx000-4xxxx000 :线程堆栈? 313xxxx000-313xxxx000 :lib文本和数据? 2xxxxxxxx000-2xxxxxxxx000 :许多混淆( 64M+…+63M+508K )块。 这种区域的数量非常接近线程的数量。 那么这些与线程相关的大区域呢? 这是合并/proc/{pid}/maps和pstack {pid} | grep Thread的结果后的结果 pstack {pid} | grep Thread : (如果0x@@@@@@@@位于这个区域内,我把*Thread ?? (Thread 0x@@@@@@@@@@ (LWP !!!!))*放在每个区域的末尾(我想@@@@是线程堆栈的基础,因此这个区域是线程堆栈的。) Region 0: 18M, 00400000-01675000 r-xp 00000000 08:02 5401 /mybinary Region 1: 236K, 01875000-018b0000 rw-p 01275000 08:02 5401 […]

vector <string>在超出范围之后不会清除内存

我遇到了以下问题,我不确定我是错的还是它的一个非常奇怪的错误。 我填充了大量的string,并希望它在某个点被清除。 这是一个简单的例子 #include <string> #include <vector> #include <unistd.h> //sleep #include <iostream> int main(){ { std::vector<std::string> strvec; for(long i = 0; i < 1000000; ++i){ std::string out = "This is gonna be a long string just to fill up the memory used by this fucking pthread\n"; strvec.push_back(out); } std::cout << "finished loading 1st\n"; sleep(10); // […]