我正在做一些关于记忆的实验。我遇到的第一个问题是如何在运行时分配给定数量的内存,比如 500MB。我需要程序的进程保持它直到程序退出。
我想可能有几种方法可以实现这一目标?我更喜欢简单但实用的。
我正在做一些关于记忆的实验。我遇到的第一个问题是如何在运行时分配给定数量的内存,比如 500MB。我需要程序的进程保持它直到程序退出。
我想可能有几种方法可以实现这一目标?我更喜欢简单但实用的。
public static void main( String[] args ) {
final byte[] x = new byte[500*1024 ]; // 500 Kbytes
final byte[] y = new byte[500*1024*1024]; // 500 Mbytes
...
System.out.println( x.length + y.length );
}
好吧,Java 对您隐藏了内存管理,因此您的问题有两个答案:
创建这种大小的数据结构,您将需要并在某个线程中保存对它们的引用,直到程序退出,因为一旦在活动线程中没有对堆上的数据的引用,它就会变成垃圾回收。在 32 位系统上,对于 125000 个单元的 int 数组或 1000 个单元的 125 个 int 数组,500MB 应该大致足够了。
如果您只想分配内存并使其可用,但不填满,则使用 -Xms=512M 启动虚拟机。这将使 VM 在启动时为您的程序分配 512 M 的内存,但它会是空的(刚刚分配),直到您需要它(执行第 1 点)。Xmx 设置程序可分配的最大内存。
jmalloc可以让你这样做,但除非你是真正的专家,否则我不会推荐它。您正在放弃对 Java 至关重要的东西——垃圾收集。你还不如写 C。
Java NIO 以这种方式在堆外分配字节缓冲区。我认为这也是 Oracle 用于内存映射 JAR 和摆脱 perm gen 的地方。