Когда вы получаете это конкретное исключение с трассировкой стека, заканчивающейся на Unsafe.allocateMemory(Native Method)
, это означает, что ОС отклонила запрос на выделение дополнительной памяти; Исключения, которые указывают на то, что вы достигли предела вашей JVM для памяти кучи Java, будут иметь другую трассировку стека.
Итак, доступны следующие исправления: сохраните некоторую память где-то в вашем приложении, купите больше физической памяти (или больший диск, чтобы иметь больше места для файлов подкачки), или проверьте, можете ли вы сконфигурировать свою операционную систему для выделения большего объема памяти например, путем увеличения пространства подкачки.
Если при этом вы выделяете обычные объекты Java (а не собственные буферы памяти или очень большие массивы примитивов), я бы порекомендовал переписать ваш код только для экономии памяти или получить машину с большим объемом ОЗУ; поскольку сборщик мусора должен обходить каждый достижимый объект в куче, чтобы пометить их как живые, это означает, что объекты, на которые вы не будете часто ссылаться, все равно должны регулярно извлекаться в память с помощью JVM ... так что используется много подкачки для небольших объектов Java становится довольно дорогим.
В случае многих больших изображений я бы порекомендовал использовать только мягкие ссылки для удержания изображений, которые, по вашему мнению, вам могут понадобиться снова, что позволяет JVM удалять их из памяти, если требуется память, но рекомендует удерживать их в памяти, если это целесообразно, чтобы избежать проблем с производительностью при регулярной их перезагрузке.