Java байтовый массив размером 1 МБ или больше занимает в два раза больше оперативной памяти - PullRequest
14 голосов
/ 22 октября 2019

Выполнение приведенного ниже кода в Windows 10 / OpenJDK 11.0.4_x64 приводит к выводу used: 197 и expected usage: 200. Это означает, что 200-байтовые массивы из одного миллиона элементов занимают ок. 200 МБ ОЗУ. Все хорошо.

Когда я меняю распределение байтового массива в коде с new byte[1000000] на new byte[1048576] (то есть на 1024 * 1024 элемента), он выдает в качестве выходных данных used: 417 и expected usage: 200. Какого черта?

import java.io.IOException;
import java.util.ArrayList;

public class Mem {
    private static Runtime rt = Runtime.getRuntime();
    private static long free() { return rt.maxMemory() - rt.totalMemory() + rt.freeMemory(); }
    public static void main(String[] args) throws InterruptedException, IOException {
        int blocks = 200;
        long initiallyFree = free();
        System.out.println("initially free: " + initiallyFree / 1000000);
        ArrayList<byte[]> data = new ArrayList<>();
        for (int n = 0; n < blocks; n++) { data.add(new byte[1000000]); }
        System.gc();
        Thread.sleep(2000);
        long remainingFree = free();
        System.out.println("remaining free: " + remainingFree / 1000000);
        System.out.println("used: " + (initiallyFree - remainingFree) / 1000000);
        System.out.println("expected usage: " + blocks);
        System.in.read();
    }
}

Глядя немного глубже с visualvm, я вижу в первом случае все как и ожидалось:

byte arrays take up 200mb

Во втором случае, в дополнение к байтовым массивам, я вижу такое же количество массивов int, занимающих тот же объем ОЗУ, что и байтовые массивы:

int arrays take up additional 200mb

Кстати, эти массивы int не показывают, что на них ссылаются, но я не могу собрать их ... (Байт-массивы прекрасно показывают, где на них ссылаются.)

Есть идеи, что здесь происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...