Java Отказывается Запускаться - не Мог зарезервировать достаточно пространства для объектной "кучи"

Для простого и эффективного средства просмотра PDF, когда вам требуется только ограниченная функциональность, вы можете (iOS 4.0+) использовать платформу QuickLook:

Во-первых, вам нужно связать ссылки с QuickLook.framework и #import <QuickLook/QuickLook.h>;

Впоследствии либо в viewDidLoad, либо в любом из ленивых методов инициализации:

QLPreviewController *previewController = [[QLPreviewController alloc] init];
previewController.dataSource = self;
previewController.delegate = self;
previewController.currentPreviewItemIndex = indexPath.row;
[self presentModalViewController:previewController animated:YES];
[previewController release];
49
задан Randyaa 30 June 2009 в 02:15
поделиться

9 ответов

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

sysctl -a

На SuSE и RedHat машины, чтобы посмотреть, есть ли отличия? Я предполагаю, что конфигурации по умолчанию в этих двух дистрибутивах различаются, что является причиной этого.

1
ответ дан 7 November 2019 в 11:52
поделиться

Какая JVM используется? Я знаю, что максимальный размер кучи BEA JRockit не превышает 1850 МБ. Он не дает сбоев, но предупреждает пользователя, что он не будет использовать более 1850 МБ.

Я не знаю, почему существует такой предел, но я знаю, что он существует для BEA JRockit.

С уважением.

1
ответ дан 7 November 2019 в 11:52
поделиться

Возможно, это далеко не так, но на ум приходят две вещи. Оба нижеследующих предполагают, что вы используете 32-битную версию Linux.

Существует ограничение на размер процесса в Linux, кажется, помните, что в CentOS он был около 2,5 ГБ и настроен в ядре (т.е. повторное изменение). Ваш процесс может столкнуться с этим, как только вы сложите весь код JVM + пространство Permgen и все остальные библиотеки JVM.

Во-вторых, я столкнулся с тем, что у вас может не хватить адресного пространства, звучит странно, я знаю. Возникла проблема с запуском Glassfish с кучей 1,5 ГБ, когда он пытался выполнить JSP, мой разветвленный javac, он терпел неудачу, потому что ОС не могла выделить достаточно адресного пространства для вновь созданного процесса, даже если в коробке было 12 ГБ памяти.

2
ответ дан 7 November 2019 в 11:52
поделиться

uограничить максимальный размер памяти и установить неограниченный объем виртуальной памяти?

3
ответ дан 7 November 2019 в 11:52
поделиться

Похоже, что для 32-битных серверов существует ограничение JVM, которое невозможно преодолеть (если вы не найдете специальную 32-битную JVM, которая не устанавливает ограничение в 2 ГБ или меньше).

Этот поток на стороне сервера есть более подробная информация, в том числе несколько человек, которые тестировали различные JVM на 32-битных архитектурах. JVM IBM, кажется, позволяет на 100 МБ больше, но на самом деле это не даст вам того, что вы хотите.

http://www.theserverside.com/discussions/thread.tss?thread_id=26347

"Настоящее" решение заключается в использовании 64-битного сервера с 64-битной JVM для получения кучи размером более 2 ГБ на процесс. Однако это ' Также важно учитывать влияние увеличения размера вашего адреса (а не только адресного пространства) с помощью 64-битной JVM. Вероятно, это повлияет на производительность и память при обработке, использующей менее 4 ГБ памяти.

Пища для размышлений: действительно ли каждое из этих заданий требует 2 ГБ памяти? Есть ли способ изменить задания таким образом, чтобы они выполнялись в пределах 1,8 ГБ, чтобы этот предел не был проблемой?

4
ответ дан 7 November 2019 в 11:52
поделиться

Запуск 32-разрядной ОС является ошибкой; вам определенно следует выполнить обновление как можно раньше.

Я не знаю, требует ли Java, чтобы его куча была в одном непрерывном фрагменте, но если это так, запрос 1,8 ГБ кучи в 32-битном блоке звучит как непростая задача. Вы предполагаете, что часть адресного пространства, почти половина его, свободна во время запуска JVM.

В зависимости от того, какие другие библиотеки загружены в данный момент, их может не быть. Библиотеки могут выделять память где угодно, поэтому ваше адресное пространство может быть настолько фрагментировано, что 1,8 ГБ не доступно в одном фрагменте.

В любом случае в 32-разрядной версии Linux доступно только около максимального адресного пространства 3G. Библиотеки и сама JVM используют некоторые из них для начала.

вам определенно следует выполнить обновление как можно раньше.

Я не знаю, требует ли Java, чтобы его куча была в одном непрерывном фрагменте, но если это так, запрос 1,8 ГБ кучи в 32-битном блоке звучит как непростая задача. Вы предполагаете, что часть адресного пространства, почти половина его, свободна во время запуска JVM.

В зависимости от того, какие другие библиотеки загружены в данный момент, их может не быть. Библиотеки могут выделять память где угодно, поэтому ваше адресное пространство может быть настолько фрагментировано, что 1,8 ГБ не доступно в одном фрагменте.

В любом случае в 32-разрядной версии Linux доступно только около максимального адресного пространства 3G. Библиотеки и сама JVM используют некоторые из них для начала.

вам определенно следует выполнить обновление как можно раньше.

Я не знаю, требует ли Java, чтобы его куча была в одном непрерывном фрагменте, но если это так, запрос 1,8 ГБ кучи в 32-битном блоке звучит как непростая задача. Вы предполагаете, что часть адресного пространства, почти половина его, свободна во время запуска JVM.

В зависимости от того, какие другие библиотеки загружены в данный момент, их может не быть. Библиотеки могут выделять память где угодно, поэтому ваше адресное пространство может быть настолько фрагментировано, что 1,8 ГБ не доступно в одном фрагменте.

В любом случае в 32-разрядной версии Linux доступно только около максимального адресного пространства 3G. Библиотеки и сама JVM используют некоторые из них для начала.

8 ГБ кучи на 32-битном блоке звучит как сложная задача. Вы предполагаете, что часть адресного пространства, почти половина его, свободна во время запуска JVM.

В зависимости от того, какие другие библиотеки загружены в данный момент, их может не быть. Библиотеки могут выделять память где угодно, поэтому ваше адресное пространство может быть настолько фрагментировано, что 1,8 ГБ не доступно в одном фрагменте.

В любом случае в 32-разрядной версии Linux доступно только около максимального адресного пространства 3G. Библиотеки и сама JVM используют некоторые из них для начала.

8 ГБ кучи на 32-битном блоке звучит как сложная задача. Вы предполагаете, что часть адресного пространства, почти половина его, свободна во время запуска JVM.

В зависимости от того, какие другие библиотеки загружены в это время, их может не быть. Библиотеки могут выделять память где угодно, поэтому ваше адресное пространство может быть настолько фрагментировано, что 1,8 ГБ не доступно в одном фрагменте.

В любом случае в 32-разрядной версии Linux доступно только около максимального адресного пространства 3G. Библиотеки и сама JVM используют некоторые из них для начала.

8G недоступен в одном фрагменте.

В любом случае в 32-разрядной версии Linux доступно только около максимального адресного пространства 3G. Библиотеки и сама JVM используют некоторые из них для начала.

8G недоступен в одном фрагменте.

В любом случае в 32-разрядной версии Linux доступно только около максимального адресного пространства 3G. Библиотеки и сама JVM используют некоторые из них для начала.

8
ответ дан 7 November 2019 в 11:52
поделиться

Вы используете 32-битную ОС, поэтому вы увидите ограничения на общий размер из-за этого. В других ответах этот вопрос рассматривается более подробно, поэтому я не буду повторять их информацию.

Я недавно заметил, что на наших серверах максимальный размер кучи указывается с помощью -Xmx , а не указывается минимальный размер кучи с -Xms приведет к тому, что виртуальная машина сервера Java немедленно попытается выделить всю память, необходимую для максимального размера кучи. И конечно, если приложение достигнет этого размера кучи, это именно тот объем памяти, который вам понадобится. Но есть вероятность, что ваши приложения будут запускаться со сравнительно небольшой кучей, а может потребовать большую кучу позже.

21
ответ дан 7 November 2019 в 11:52
поделиться

Как указано в других ответах, проблема вызвана исчерпанием виртуального адресного пространства. 32-битная программа в пользовательском пространстве Linux обычно ограничена 3 ГБ AS; оставшийся 1 ГБ используется ядром (объяснение: поскольку верхний 1 ГБ является фиксированным отображением ядра, при обслуживании системных вызовов не нужно касаться таблицы страниц).

Однако ядра RHEL реализуют так называемое разделение 4 ГБ / 4 ГБ, где полная автономная система на 4 ГБ доступна для процессов пользовательского пространства за счет незначительных накладных расходов времени выполнения (ядро находится в отдельной виртуальной автономной системе на 4 ГБ)

15
ответ дан 7 November 2019 в 11:52
поделиться

Вам нужно подумать об обновлении вашей ОС и Java. Java 5.0 - это EOL, но если вы не можете выполнить обновление до Java 6, вы можете использовать последний уровень исправления 22!

32-разрядная версия Windows ограничена размером ~ 1,3 ГБ, так что вы можете установить максимальное значение 1,8. Примечание: это проблема с постоянной памятью, и по мере того, как ваша система работает, ее пространство памяти может фрагментироваться, поэтому меня не удивляет, что у вас есть эта проблема.

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

Кстати, по моему опыту, 32-битная Java 5.0 может быть быстрее 64-битной Java 5.0. Лишь много лет спустя обновление Java 6 10 стало быстрее для 64-разрядных версий.

2
ответ дан 7 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

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