java - 使用了多少字节?

标签 java memory byte

考虑一个 MysteryBox 类型的对象,它存储 N 个 boolean 类型的项目 在长度为 N 的数组 item[] 中。

public class MysteryBox {       // 16B (object overhead)
    private int N;              // 4B (int)
    private boolean[] items;    // 8B (reference to array)
                        // 24B (header of array)
                        // N (boolean array of size N)
// 4B for padding
// 17N (boolean objects, 16B of object metadata, 1B of data equivalent to 1 boolean)
    ...
}

使用多少字节作为 N(64 位内存成本模型)的函数?我的回答正确吗?

最佳答案

让我们通过实验找出答案!

public static void main(String[] args)
{
    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); //This might cause a little bit of error
    for(int N=1400;N<5000;N+=100) //this is on the stack, so it shouldn't affect us
    {
        int[] reserved = new int[1000]; //we'll clear this later
        MysteryBox box = new MysteryBox(N);
        int count = 1;
        while(true)
        {
            try
            {
                MysteryBox temp = new MysteryBox(N);
                temp.next = box; //don't worry, this extra variable was subtracted out during analysis
                box=temp;
                count++;
            }
            catch(java.lang.OutOfMemoryError e)
            {
                reserved = null;
                MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
                long maxMemory = heapUsage.getMax();
                long usedMemory = heapUsage.getUsed();
                System.out.println(N+ " : " + count + " : Memory Use :" + usedMemory + "/" + maxMemory + "");
                break;
            }
        }
    }
}

结果:每个 MysteryBox 的内存使用量相对于 N 是极其线性的(r^2 舍入到 1)。以字节为单位的内存使用量由 1.0052N+33.84 给出。因此,显然每个 boolean 值占用大约一个字节,而所有其余开销都适合大约 34 个字节。我将留给您推测开销是如何分配的。

关于java - 使用了多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26768320/

相关文章:

python - 了解 Python 进程的内存增长(VmRSS 与 gc.get_objects)

c++ - 在 C/C++ 中避免内存泄漏的方法

c - 算术和递归函数调用的堆栈内存使用

java - 如何集成 Javafx 和 Spring MVC

java - LibGDX:如何在FitViewport的黑条区域中绘制?

java - 1 个 JFrame 中的多个 JPanel 在调用时显示

c# - 在c#中将字节转换为二进制字符串

java - 更新后单击 Vector Assets 上的颜色时 Android Studio 崩溃

c# - 无法将参数值从 Byte[] 转换为 String

ruby - 在 Ruby 中从一个字节获取两个半字节