aba*_*gat 2 java memory memory-management
我知道Java的实现尽其所能隐藏开发人员的信息,但我正在构建一个不依赖于第三方库的内存限制算法,因此信息会派上用场.
特别是,我将许多大型int[]数组分配为实例变量.我将很快调查更紧凑的表示,但是现在我有兴趣知道对于普通数组使用了多少空间.
那么,一个int领域可以结束了占用多于4个字节,由于填充......但从根本上它是4个字节(32位).至于它是否需要超过4个字节,你必须尝试找出答案.这对于对象内的字段来说相当容易; 基于堆栈的int值更难.
例如,大量的数据int总是占据其长度的大约4倍(+长度等的少量开销).我不相信会在元素之间应用填充 - 尽管验证它会相对容易.返回的值Runtime.totalMemory() - Runtime.freeMemory()应该只是小心使用,但是如果你在一次运行中分配一百万个整数的数组,那么在另一个运行中分配200万个整数,然后是300万个整数,那么应该相当清楚发生了什么.
示例代码:
public class Test {
public static void main(String[] args) {
int size = Integer.parseInt(args[0]);
long before = getUsedMemory();
int[] array = new int[size];
long after = getUsedMemory();
long difference = after - before;
System.out.println("Total difference: " + (after - before));
System.out.println("Per element: " + ((double) difference) / size);
System.out.println(array); // Make sure the array isn't GC'd early
}
private static long getUsedMemory() {
Runtime rt = Runtime.getRuntime();
return rt.totalMemory() - rt.freeMemory();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上,尝试使用100000,2000000和3000000为所有运行提供"4*size + 16"字节.