Как моделировать Из памяти: Требуемый размер массива превышает предел VM

Я использовал Из справки Памяти от сайта солнца. Где это заключается в кавычки как

Из Памяти: Требуемый размер массива превышает предел VM

Это указывает, что приложение попыталось выделить массив, который больше, чем размер "кучи". Например, если приложение попытается выделить массив 512 МБ, но максимальный размер "кучи" составляет 256 МБ, то эта ошибка будет брошена. В большинстве случаев проблема, вероятно, будет или что размер "кучи" является слишком небольшим или что ошибка приводит к приложению, пытающемуся создать массив, размер которого вычисляется, чтобы быть неправильно огромным.

Я пытался моделировать это

import java.util.ArrayList;
import java.util.List;

public class JavaTest {
    public static void main(String[] args){
        long[] ll = new long[64*1024*1024];
    }
}

на моей машине с

javac *.java;java -Xmx256m JavaTest

Но вышеупомянутая строка производит

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at JavaTest.main(JavaTest.java:7)

Что я пропускаю?

Обновление: Моя версия Java

$java -version
java version "1.6.0_15"
Java(TM) SE Runtime Environment (build 1.6.0_15-b03)
Java HotSpot(TM) Server VM (build 14.1-b02, mixed mode)

10
задан skaffman 29 January 2012 в 12:38
поделиться

4 ответа

Для меня

long[] l = new long[Integer.MAX_VALUE];

дает Исключение в потоке "main" java.lang.OutOfMemoryError: Запрошенный массив размер превышает предел виртуальной машины

PS: если вам нужно создать исключение для целей тестирования, вы также можете просто выбросить новую OutOfMemoryError («Запрошенный размер массива превышает предел виртуальной машины») сами.

22
ответ дан 3 December 2019 в 17:20
поделиться

Массив выделяется как непрерывное пространство кучи, и память может фрагментироваться из-за выделения объектов и сборки мусора. Ошибка нехватки памяти возникает из-за отсутствия твердого блока памяти для выделения массива. Вы явно отправили память JVM с флагом -Xmx?

1
ответ дан 3 December 2019 в 17:20
поделиться

Попробуйте выделить, скажем, список ArrayList и удвоить его размер во время выполнения.

0
ответ дан 3 December 2019 в 17:20
поделиться

Просто взглянув на пример, люди сталкиваются с проблемой, которая, кажется, возникает, когда люди используют собственный интерфейс java, мост между приложениями C ++.

При запуске приложения на чистом Java стандартная процедура для выделения массива - это вычисление необходимых байтов из переменной размера, переданной в замедлении массива, с выдачей исключения java.lang.OutOfMemoryError: Java heap space .

Когда массив создается вне JVM, похоже, он генерирует другое исключение. Я уверен, что у такого другого поведения есть какая-то техническая причина.

Вы можете попробовать воспроизвести проблему, описанную этим человеком, на этом другом форуме .

0
ответ дан 3 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: