Я использовал Из справки Памяти от сайта солнца. Где это заключается в кавычки как
Из Памяти: Требуемый размер массива превышает предел 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)
Для меня
long[] l = new long[Integer.MAX_VALUE];
дает Исключение в потоке "main" java.lang.OutOfMemoryError: Запрошенный массив размер превышает предел виртуальной машины
PS: если вам нужно создать исключение для целей тестирования, вы также можете просто выбросить новую OutOfMemoryError («Запрошенный размер массива превышает предел виртуальной машины»)
сами.
Массив выделяется как непрерывное пространство кучи, и память может фрагментироваться из-за выделения объектов и сборки мусора. Ошибка нехватки памяти возникает из-за отсутствия твердого блока памяти для выделения массива. Вы явно отправили память JVM с флагом -Xmx?
Попробуйте выделить, скажем, список ArrayList и удвоить его размер во время выполнения.
Просто взглянув на пример, люди сталкиваются с проблемой, которая, кажется, возникает, когда люди используют собственный интерфейс java, мост между приложениями C ++.
При запуске приложения на чистом Java стандартная процедура для выделения массива - это вычисление необходимых байтов из переменной размера, переданной в замедлении массива, с выдачей исключения java.lang.OutOfMemoryError: Java heap space
.
Когда массив создается вне JVM, похоже, он генерирует другое исключение. Я уверен, что у такого другого поведения есть какая-то техническая причина.
Вы можете попробовать воспроизвести проблему, описанную этим человеком, на этом другом форуме .