当前位置: 首页 > 面试题库 >

Java 内存中字节的大小

史昀
2023-03-14
问题内容

我听过关于Java程序中一个字节占用的内存量的意见不一。

我知道您在一个Java字节中最多可以存储+127,并且文档说一个字节只有8位,但是在这里我被告知实际上它占用的内存量与int相同,因此仅一种有助于代码理解而不是效率的类型。

谁能解决这个问题,这将是实现特定的问题吗?


问题答案:

好的,已经进行了很多讨论,而没有很多代码:)

这是一个快速基准测试。谈到这种事情,通常会有一些警告-测试内存由于JITting等原因而有些奇怪,但是如果数量合适,反正还是很有用的。它有两种类型,每种类型都有80个成员-LotsOfBytes具有80个字节,LotsOfInts具有80个int。我们构建了很多它们,确保它们没有被GC处理,并检查内存使用情况:

class LotsOfBytes
{
    byte a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
    byte b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
    byte c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
    byte d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
    byte e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}

class LotsOfInts
{
    int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
    int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
    int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
    int d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
    int e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}


public class Test
{
    private static final int SIZE = 1000000;

    public static void main(String[] args) throws Exception
    {        
        LotsOfBytes[] first = new LotsOfBytes[SIZE];
        LotsOfInts[] second = new LotsOfInts[SIZE];

        System.gc();
        long startMem = getMemory();

        for (int i=0; i < SIZE; i++)
        {
            first[i] = new LotsOfBytes();
        }

        System.gc();
        long endMem = getMemory();

        System.out.println ("Size for LotsOfBytes: " + (endMem-startMem));
        System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));

        System.gc();
        startMem = getMemory();
        for (int i=0; i < SIZE; i++)
        {
            second[i] = new LotsOfInts();
        }
        System.gc();
        endMem = getMemory();

        System.out.println ("Size for LotsOfInts: " + (endMem-startMem));
        System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));

        // Make sure nothing gets collected
        long total = 0;
        for (int i=0; i < SIZE; i++)
        {
            total += first[i].a0 + second[i].a0;
        }
        System.out.println(total);
    }

    private static long getMemory()
    {
        Runtime runtime = Runtime.getRuntime();
        return runtime.totalMemory() - runtime.freeMemory();
    }
}

在我的盒子上输出:

Size for LotsOfBytes: 88811688
Average size: 88.811688
Size for LotsOfInts: 327076360
Average size: 327.07636
0

因此,显然存在一些开销-从外观上看为8个字节,尽管不知何故LotsOfInts只有7个字节(如我所说,这里有些奇怪)-但问题是字节字段似乎被打包成LotsOfBytes的样子, (除去开销后)仅占用LotsOfInts内存的四分之一。



 类似资料:
  • 正在显示此错误消息,有什么建议吗? php中允许的内存大小为33554432字节(尝试分配43148176字节)

  • 我正在尝试运行artisan make:controller。 我有一个问题: 我试图增加

  • 我有以下代码: 不同的文件: 由于我编写了Mail()函数,因此出现以下错误: 致命错误:允许的内存大小134217728字节已用尽(尝试分配65488字节)

  • 问题内容: 我的磁盘上只有168MB的文件。这只是一个逗号分隔的单词,id的列表。该单词的长度可以为1-5个字符。有650万行。 我在python中创建了一个字典,将其加载到内存中,因此我可以针对该单词列表搜索传入的文本。当python将其加载到内存中时,它显示已使用的1.3 GB RAM空间。知道为什么吗? 假设我的word文件如下所示… 然后再加上650万。然后,我遍历该文件并创建一个字典(p

  • 在同一个系统中,我可以调用数据库,没有问题,但在某些情况下(与最大的表),我得到 “PHP致命错误:第311行的/home/forge/sximo.sp-marketing.com/vendor/laravel/framework/src/light/Database/Connection.PHP中允许的内存大小为536870912字节(尝试分配32字节) 我调试了代码,问题是一个基本查询: 当我

  • 问题内容: 正在显示此错误消息,有什么建议吗? 允许的内存大小为33554432字节,已在php中耗尽(尝试分配43148176字节) 问题答案: 最后我找到了答案: 只需将以下行添加到文件中出现错误的行之前 它将无限使用服务器的内存,工作正常。 感谢您提出建议的朋友。