Intereting Posts
org.apache.hadoop.security.AccessControlException: разрешение отклонено при попытке доступа к веществу S3 через s3n URI с использованием Java-API Hadoop на EC2 Рестайлинг комплексного объекта для XML-сериализации Полиморфизм времени выполнения на Java без «абстрактного»? Несколько jpa: репозитории в xml config, как настроить с помощью @EnableJPARepositories с помощью Spring java config? Найдите местоположение / положение JFrame в окне Какой метод используется для завершения выполнения программы Java между ними? Массив треугольника 2d Паскаля – форматирование печатного выхода Как преобразовать объект в входной stream Как использовать библиотеку Java JSch для чтения удаленных файлов по строкам? Android: Как изменить высоту ProgressBar? Перемотка в Hashmap JPA Criteria API IN выражение Список параметров Как вы получаете доступ к annotations полей из пользовательского конвертера с помощью Simple? Менеджер макетов для фоновых изображений и текста SWT Исключение при запуске jar: Исключение в streamе «main» org.eclipse.swt.SWTException: Неверный доступ к streamу

Что происходит, когда JVM исчерпывает память для выделения во время выполнения?

Подумав в течение длительного времени об общем способе задать этот вопрос (и не найдя его), я просто попрошу об этом в качестве конкретного примера:

Предположим, у меня есть машина Linux, у которой есть 1 Гб памяти, которую она может выделить для процессов (физические и своп-итоги 1 Гб).

У меня на компьютере установлена ​​стандартная версия Hotspot JVM версии 7 версии 7. Если в данный момент существует достаточно программ, работающих с таким количеством программ, что только 400 Мб этого 1 Гб бесплатны, и я запускаю в этот момент программу Java со следующими флагами JVM:

java -Xms256m -Xmx512m -jar myJar.jar 

что происходит? :

A. Неужели JVM не сразу начнет работать, потому что он попытается выделить все 512 МБ памяти и сбой (из-за того, что на данный момент недостаточно доступной памяти)?

если запускается JVM:

если в какой-то момент для запуска Java-процесса потребуется более 400 МБ памяти (и до сих пор остается только 400 МБ свободной памяти, кроме того, что уже используется в текущем Java-процессе), что произойдет:

B. будет ли процесс Java терпеть неудачу с OutOfMemroyError?

C. будет ли он с другой (стандартной) ошибкой?

D. Это неопределенное поведение?

-Xmx определяет максимальный размер кучи. Это не гарантирует, что на нем столько памяти или нет. Это гарантирует, что куча никогда не будет больше, чем заданное значение. Тем не менее, вариант B.), произойдет outOfMemoryError.

Предположим, у меня есть машина Linux, у которой есть 1 Гб памяти, которую она может выделить для процессов (физические и своп-итоги 1 Гб).

Мой первый ответ был бы, если вы не говорите о телефоне, я получаю больше памяти. Вы можете купить 16 ГБ (бит = бит, B = байт) за менее чем 100 долларов США.

не удалось ли запустить JVM сразу, потому что он попытается выделить всю память 512 МБ и потерпеть неудачу (из-за того, что на данный момент недостаточно доступной памяти)?

Это может произойти, если ваша система не имеет 512 МБ (плюс некоторые накладные расходы), поскольку она выделяет непрерывную виртуальную память, используемую для кучи при запуске.

Даже если у вас есть 550 МБ бесплатно, программа может не запускаться, так как нужно загружать больше, чем просто кучу.

произойдет ли процесс Java с помощью OutOfMemoryError?

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

сработает ли он с другой (стандартной) ошибкой?

Это возможно, если у вас закончилось место подкачки после запуска программы. Это редко и происходит только на сильно перегруженной машине. То, что я видел, это сбои JVM из-за сбоя ОС низкого уровня для выделения памяти.

Обновление Java 6 25 Авария VM: недостаточная память

OutOfMemroyError будет « OutOfMemroyError , когда виртуальная машина Java не сможет выделить объект, потому что у него нет памяти, и сборщик мусора не может сделать доступной больше памяти».

Итак, по сути, «B. Процесс Java терпит неудачу с OutOfMemroyError » .

Если у вас так много занимаемой памяти, что свободное пространство не может даже поддерживать простоя JVM, вы получите либо некоторую ошибку, заявив, что в программе недостаточно памяти, либо сбой JVM.

Если вы можете запустить JVM, вы можете указать ограничение на кучу пространства с -Xmx. Это не означает, что вся куча будет выделена JVM при запуске – это всего лишь внутренний предел. Если JVM захочет увеличить кучу пространства, но памяти недостаточно, или вам нужно больше кучи, чем указано -Xmx, вы получите OutOfMemoryError в текущих программах Java.

В очень экстремальном состоянии у вас может закончиться свободная память во время работы JVM, и в то же время JVM требует больше памяти для внутренней работы (а не для кучи) – тогда JVM говорит вам, что для этого требуется больше памяти, но не мог получить и прекратить, или он рухнет.

Процесс JVM будет выполняться в виртуальной памяти, поэтому вопрос о распределении других запущенных процессов имеет значение, но не полностью детерминирован.

Когда JVM не может выделить больше памяти (по какой-либо причине), сам процесс не заканчивается, а скорее запускает OutOfMemoryError в JVM, но не является внешним для JVM. Другими словами, JVM продолжает работать, но программы, запущенные в JVM, обычно терпят неудачу, потому что большинство из них не справляются с низкими требованиями к памяти. В этом довольно распространенном случае, когда программа ничего не делает для обработки ошибки, JVM завершит работу программы и завершит ее. В конечном счете это происходит из распределения памяти, но не напрямую. Возможно, что часть кода вернется в состояние низкой памяти и продолжит работу.

И другие отметили, иногда бывает, что сам JVM плохо справляется с низкой памятью, но это довольно экстремальное условие.