标签: virtual-memory

64位大型mallocs

malloc()失败的原因是什么,尤其是64位?

我的具体问题是试图在64位系统上使用巨大的10GB RAM.该机器具有12GB的RAM和32 GB的交换空间.是的,malloc极端,但为什么会出现问题呢?这是在Windows XP64中同时包含Intel和MSFT编译器.malloc有时成功,有时不成功,约50%.8GB malloc总是工作,20GB malloc总是失败.如果malloc失败,重复请求将不起作用,除非我退出该过程并再次开始一个新进程(这将成功获得50%的注射).没有其他大型应用程序正在运行 它会在重新启动后立即发生.

我可以想象如果你已经用完了32位(或31位)可用的地址空间,那么malloc会失败32位,这样就没有足够大的地址范围可以分配给你的请求了.

我还可以想象,如果你已经用完物理内存你的硬盘交换空间,malloc会失败.对我来说情况并非如此.

但为什么malloc会失败呢?我想不出其他原因.

我对一般malloc问题比我的具体例子更感兴趣,无论如何我都可能用内存映射文件替换它.失败的malloc()只是一个难题而不是其他任何东西......想要了解你的工具而不是对基础知识感到惊讶.

memory windows malloc 64-bit virtual-memory

17
推荐指数
3
解决办法
1万
查看次数

获取JVM以根据需要增加内存需求,达到VM限制的大小?

我们发布了一个Java应用程序,其内存需求可能会有很大差异,具体取决于它正在处理的数据大小.如果未设置最大VM(虚拟内存)大小,则JVM通常会在大数据上因GC失败而退出.

我们希望看到的是,JVM请求更多内存,因为GC无法提供足够的内存,直到总可用VM耗尽为止.例如,以128Mb开始,并在GC失败时增加几何(或其他一些步骤).

JVM("Java")命令行允许显式设置最大VM大小(各种-Xm*命令),并且您认为这将被设计为足够的.我们尝试在随应用程序提供的.cmd文件中执行此操作.但是如果你选择任何特定的数字,你会得到两种不良行为之一:1)如果你的数量足够小,可以在大多数目标系统上工作(例如,1Gb),那么它对于大数据来说不够大,或者2)如果如果它非常大,JVM拒绝在实际VM小于指定的系统上运行.

如何设置Java以在需要时使用可用的VM,而不事先知道这个数字,并且在启动时没有抓住它?

java command-line virtual-memory

16
推荐指数
6
解决办法
2万
查看次数

C中的指针实现细节

我想知道违反我在下面列出的假设的架构.此外,我想知道所有架构的假设是否都是错误的(也就是说,如果它们中的任何一个完全错误的话).

  1. sizeof(int*)== sizeof(char*)== sizeof(void*)== sizeof(func_ptr*)

  2. 无论指向哪种数据类型,给定体系结构的所有指针的内存中表示都是相同的.

  3. 指针的内存中表示与与体系结构相同的位长的整数相同.

  4. 指针数据类型的乘法和除法仅被编译器禁止.注意:是的,我知道这是荒谬的.我的意思是 - 是否有硬件支持禁止这种不正确的用法?

  5. 所有指针值都可以转换为单个整数.换句话说,哪些架构仍然使用分段和偏移?

  6. 递增指针相当于添加sizeof(the pointed data type)指针存储的内存地址.如果pint32*p+1则等于4字节后的内存地址p.

我最习惯在连续的虚拟内存空间中使用指针.对于这种用法,我通常可以将它们视为数字线上的地址.请参阅堆栈溢出问题指针比较.

c pointers sizeof virtual-memory

16
推荐指数
4
解决办法
5104
查看次数

获得尽可能多的未初始化的内存

我正在尝试创建一个C/C++程序,尽可能多地转储未初始化的内存.该程序必须由本地用户运行,即在用户模式下运行.

它不能使用malloc: 为什么malloc在gcc中将值初始化为0?

目标不是将此数据用作随机种子.

操作系统是否始终确保您无法看到其他进程的"剩余空间"?

如果可能,我想参考实现或进一步解释.

c virtual-memory

16
推荐指数
2
解决办法
471
查看次数

为什么不解决分叉过程中的变化?

我正在尝试理解fork()和处理地址空间。我写了一个基本的概念证明程序,它派生出一个新进程并更改新进程中的一个变量。我的期望是,当我更改孩子中的变量时,这应该会导致该变量获得新地址。如果我理解正确,Linux 会使用 fork 进行写时复制。所以我希望父级和子级中的变量地址匹配,直到我在其中之一中更改它。那么我希望他们会有所不同。然而,这不是我所看到的。

这是因为写时复制从物理内存中分配了一个新页面,但进程地址空间没有改变 - 只是由 TLB 重新映射到新页面?还是我不理解这一点或在我的程序中犯了转储错误?

概念验证代码:

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void describe(const std::string &descr, const int &data) {
    pid_t ppid = getppid();
    pid_t pid = getpid();

    std::cout << "In " << descr << ":\n"
              << "Parent Process ID:  " << ppid
              << "\nMy Process ID:  " << pid
              << "\nValue of data:  " << data
              << "\nAddress of data:  " << &data << "\n\n";
}

void change(int &data) …
Run Code Online (Sandbox Code Playgroud)

c c++ linux fork virtual-memory

16
推荐指数
1
解决办法
477
查看次数

sysinternals进程资源管理器中的"虚拟大小"是什么

我的应用程序运行了几个小时,任务管理器的任何值(vmsize,内存)都没有增加.但几个小时后,我出现内存错误.

在sysinternals中,我看到"虚拟大小"正在不断增加,当它达到2 GB左右时,我开始出现内存错误.

那是什么样的内存泄漏?我如何用代码演示它?是否有可能用任何代码片段重现相同的内容,其中没有内存值增加但只有sysinternsl进程资源管理器中的虚拟大小增加?

谢谢你的任何建议

memory windows virtual-memory

14
推荐指数
2
解决办法
2万
查看次数

如何计算页面大小?

给定:64位虚拟字节地址,16 KB页面,32位物理字节地址.

假设有效,保护,脏和使用位总共占用4位并且所有虚拟页面都在使用中,则本机上页表的总大小是多少.

到目前为止,我知道页表条目的总数:2 ^ 64/2 ^ 14 = 2 ^ 50,但我无法理解如何查找每个条目的大小.

如问题中所述,每个条目确实包含4位,但是可以从物理字节地址中找到条目的大小其余部分吗?我在这部分感到困惑.

谢谢.

virtual virtual-memory

14
推荐指数
2
解决办法
6万
查看次数

如何避免在高内存使用率应用程序中耗尽内存?C/C++

我编写了一个转换器,它接受openstreetmap xml文件并将它们转换为二进制运行时渲染格式,通常约为原始大小的10%.输入文件大小通常为3GB或更大.输入文件不会一次性加载到内存中,而是在收集点和多边形时进行流式处理,然后在它们上运行bsp并输出文件.最近在较大的文件上,它耗尽内存并死掉(有问题的一个有1400万个点和100万个多边形).通常我的程序在发生这种情况时使用大约1gb到1.2gb的ram.我已经尝试将虚拟内存从2增加到8GB(在XP上),但这种改变没有任何效果.此外,由于此代码是开源的,我希望无论可用的ram(尽管速度较慢)都可以使用它,它可以在Windows,Linux和Mac上运行.

我可以使用哪些技术来避免内存不足?处理较小子集中的数据,然后合并最终结果?使用我自己的虚拟内存类型的处理程序?还有其他想法吗?

c c++ memory virtual-memory

13
推荐指数
1
解决办法
9286
查看次数

如何使用页表将虚拟地址转换为物理地址?

可以说我有一个普通的页面表:

页表(页面大小= 4k)

      Page #:  0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15          
Page Frame #:  3  x  1  x  0  x  2  x  5  x   7   4   6   x   x   x
Run Code Online (Sandbox Code Playgroud)

如何将51996之类的任意逻辑地址转换为物理内存地址?


如果我使用log base 2(4096),我得到12.我认为这是我想用于地址偏移的位数.

我只是不确定.51996/4096 = 12.69.那么这是否意味着它位于第12页,具有一定的偏移量?

然后我如何将其转换为"51996"的物理地址?

memory paging memory-management virtual-memory memory-address

13
推荐指数
2
解决办法
4万
查看次数

现代硬件的算法?

再一次,我发现自己有一套破碎的假设.通过修改经验证的最优算法来考虑虚拟内存,文章本身的性能提升了10倍:

在一个现代多发出CPU上,以几千兆赫的时钟频率运行,最坏情况下每个VM页面故障损失近1000万条指令.如果您使用旋转磁盘运行,则该数字更像是1亿条指令.

如果这些操作导致页面错误和磁盘操作速度慢,那么O(log2(n))算法有什么用呢?对于大多数相关数据集,O(n)或甚至O(n ^ 2)算法可避免页面错误,它将围绕它运行圆圈.

周围有更多这样的算法吗?我们是否应该重新审视我们教育的所有基本组成部分?在编写自己的文章时还需要注意什么?

澄清:

所讨论的算法并不比经过验证的最佳算法快,因为Big-O符号存在缺陷或无意义.它更快,因为经过验证的最优算法依赖于在现代硬件/操作系统中不正确的假设,即所有内存访问都是相同且可互换的.

language-agnostic algorithm caching virtual-memory

13
推荐指数
2
解决办法
542
查看次数