java - RAM 内存重新分配 - Windows 和 Linux

标签 java .net memory-management

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

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

最佳答案

您在错误的抽象级别上工作。

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

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

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

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

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

关于java - RAM 内存重新分配 - Windows 和 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1738515/

相关文章:

.net - 类级验证

iphone - 如何改善 iPad 应用程序的内存占用

java - Mysql占用更多RAM空间并逐渐增加,没有任何下降

java - 带 float 的 View 支架

java - 在 Jsch 中设置 ASCII 模式

java - 当我按空格键时我的子弹没有发射

java - 判断groovy.sql中Oracle查询结果的数据类型

c# - 如何激活将操作作为其参数的通用方法

c# - Windows 10 是否预装了 .NET Core?

c - 内存分配和泄漏问题?