如果我有一个2 GB的RAM并且我有一个2个实例的对象,每个1.5 GB,操作系统将帮助和上下文切换硬盘和从硬盘切换页面.
如果我有1个实例但是3 GB,该怎么办?相同的分页方法可以将这个实例分解为2页吗?或者我会遇到内存不足的问题?
我还想将相同的问题应用于对象旁边的其他数据结构,将它作为一个整体进行分页,还是将其分解为更小的单元.
谢谢.
也许是一个天真的问题,但......
确认或否认:
自动和静态存储持续时间的对象/变量的内存的存在是在编译时确定的,并且由于没有足够的内存用于自动对象,程序将无法运行时失败.
当然,当自动对象的构造函数执行动态分配并且这样的分配失败时,我们认为这是动态分配的失败,而不是自动的.
我有一个C++应用程序,我试图消除内存泄漏,我意识到我不完全理解虚拟和物理内存之间的区别.
结果top(所以16.8g =虚拟,111m =物理):
4406 um 20 0 16.8g 111m 4928 S 64.7 22.8 36:53.65 client
我的进程拥有500个连接,每个用户一个,这些数字意味着每个用户有大约30 MB的虚拟开销.没有进入我的应用程序的细节,这可能听起来远程逼真的唯一方法,将所有向量,结构,线程,函数堆叠在一起等,是我不知道虚拟内存实际意味着什么.没有-O优化标志,顺便说一句.
所以我的问题是:
delete或free()等)必然会减少物理和虚拟内存使用量?是什么决定了必须分配给虚拟内存环境中正在运行的进程的最小页面帧数.
我发现上述问题的答案是instruction set architecture但却无法理解其背后的原因.
请解释.
编辑: 问题在以下链接http://www.geeksforgeeks.org/archives/4036(见问题3),我无法理解答案背后的逻辑.
根据大会入门黑客(第2部分)虚拟内存组织,Linux程序.text部分从头开始,0x0804800堆栈顶部开始0xbffffff.这些数字有什么意义?为什么不开始.text在0x0000000(或0x0000020或0x0000040去下一个32或64位过去的NULL)?为什么不在堆栈顶部开始0xfffffff?
我知道在32位Windows上运行的32位进程的默认页面大小是4K,而在64位Windows上运行的64位进程的默认页面大小是8K.但是,在64位Windows(即WOW64)上运行的32位进程的实际页面大小是多少?4K?8K?
我正在回答一些与虚拟内存相关的问题,并希望在澄清或确认我对这些内容如何完成的理解方面提供一些帮助.
问题如下:
给定一个具有32位字的字节可寻址系统,4千兆字节的虚拟地址空间,1千兆字节的物理地址空间和4千字节的页面大小.假设页表条目向上舍入为4个字节.
a)页表的大小(以字节为单位)是多少?
b)现在假设实现了4路组关联转换后备缓冲器,总共256个地址转换.计算其标记和索引字段的大小.
我的答案如下:
A:
页表的大小等于页表中的条目数乘以条目的大小.
页表中的条目数等于内存大小除以页面大小:2 ^ 32/2 ^ 12 = 2 ^ 20.
条目的大小等于字大小减去用于页表中条目数的位:32-20 = 12.
因此,页表大小为:(2 ^ 20)*12位= 12582912位= 1572864字节
但是,我发现这个(在"页面大小"的标题下),它使用基本相同的数字.
页表大小=((虚拟地址空间大小)/(页面大小))*(页表条目大小)=(4 GB/4 KB)*4 B = 4 MB
哪个答案是对的?
接下来,B:
我不确定如何计算B部分.我相信标签是通过添加块数,加上偏移量加上索引来计算的.这是一个4路组关联,因此每组中有4个块.索引是8位,因为基本索引大小是10位并且减少2,这也是因为它是4路组关联.但是,我不知道如何计算偏移量,这是帮助计算标记所需的.
任何帮助将非常感激.
使用VirtualAllocAPI分配和提交具有两个页面边界大小的幂的虚拟内存区域时,例如:
void* address = VirtualAlloc(0, 0x10000, MEM_COMMIT, PAGE_READWRITE); // Get 64KB
Run Code Online (Sandbox Code Playgroud)
在address似乎永远在64KB对齐,而不仅仅是页面边界,这在我的情况是4KB。
问题是:这种一致性是可靠和明确的,还是偶然的? 文档指出,它保证在页面边界上,但是没有解决我所看到的问题。我问是因为稍后我想获取一个任意指针(由使用此块的池分配器提供),并通过类似于以下内容的方法确定它属于哪个64KB块:
void* chunk = (void*)((uintptr_t)ptr & 0xFFFF0000);
Run Code Online (Sandbox Code Playgroud) 我正在运行MapReduce管道程序,我已将内存限制设置如下:
在yarn-site.xml中:
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>3072</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>
Run Code Online (Sandbox Code Playgroud)
在mapred-site.xml中:
<property>
<name>mapreduce.map.memory.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx384m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx384m</value>
</property>
Run Code Online (Sandbox Code Playgroud)
我目前在伪分布式模式下运行在单个节点上.在容器被杀之前我收到以下错误:
2015-04-11 12:47:49,594 INFO [AsyncDispatcher event handler] org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl: Diagnostics report from attempt_1428741438743_0001_m_000000_0: Container [pid=8140,containerID=container_1428741438743_0001_01_000002] is running beyond virtual memory limits. Current usage: 304.1 MB of 1 GB physical memory used; 1.0 TB of 2.1 GB virtual memory used. Killing container.
Run Code Online (Sandbox Code Playgroud)
我担心的主要问题是使用了1.0 TB的虚拟内存,我运行的应用程序远远没有消耗这么多的内存,它甚至远远没有消耗1 GB的内存.
这是否意味着我的代码中存在内存泄漏,或者我的内存配置是否错误?
谢谢.
问候,
根据一些操作系统的教科书,为了更快地进行上下文切换,人们在TLB标签字段中为每个进程添加了ASID,因此我们不需要在上下文切换中刷新整个TLB。
我听说有些ARM处理器和MIPS处理器在TLB中确实具有ASID。但是我不确定Intel x86处理器是否具有ASID。
同时,似乎ASID通常具有比PID(32位)少的位(例如8位)。那么,如果在上述8位ASID情况下内存中的进程比2 ^ 8多,那么系统如何处理“ ASID溢出”?