RAM内存重新分配 - Windows和Linux

kjv*_*kjv 2 .net java memory-management

我正在开展一个涉及优化系统内能耗的项目.该项目的一部分在于根据位置分配RAM内存,即为程序分配尽可能彼此接近的内存段.有没有办法我可以知道我分配的内存的位置到底在哪里(内存芯片),我也想知道是否有可能以确定的方式强制分配.我对Windows和Linux都很感兴趣.此外,该项目将在Java和.NET中实现,因此我对托管API感兴趣以实现此目的.

[我知道这可能不会转化为直接的能源消耗减少,但该项目应该是一个概念证明.]

use*_*876 13

你在错误的抽象层面上工作.

Java(可能是.NET)是指使用句柄而不是原始指针的对象.底层Java VM可以随时在虚拟内存中移动对象; Java应用程序没有看到任何区别.

Win32和Linux应用程序(例如Java VM)使用虚拟地址引用内存.存在从RAM芯片上的虚拟地址到物理地址的映射.内核可以随时更改此映射(例如,如果数据被分页到磁盘然后读回到不同的内存位置),应用程序看不到任何差异.

因此,如果您使用的是Java和.NET,我不会更改您的Java/.NET应用程序来实现这一目标.相反,我会改变底层的Linux内核,或者可能是Java VM.

对于原型,一种方法可能是使用mem =参数启动Linux以将内核的内存使用量限制为小于您拥有的内存量,然后查看是否可以mmap备用内存(可能通过映射/ dev/mem)作为根?).然后,您可以更改Java VM中对malloc()的所有调用,以使用您自己的特殊内存分配器,该分配器从该可用空间分配.

要真正实现这一点,您应该通过更改内核并保持用户空间兼容性来实现.看一下Linux中内存hotplug的工作,例如http://lhms.sourceforge.net/