Java и Tomcat - CodeCache заполнен. Компилятор отключен

Моя ситуация

  • Я разработал веб-сервис для анализа документов.
  • Этот веб-сервис читает документы txt и pdf.
  • Для чтения pdf файлов я использую java-библиотеку, разработанную моим университетским консультантом.
  • Я использую Java 7
  • В настоящее время я размещаю его на Tomcat v7.0
  • Если я создаю военный файл из своего приложения и размещаю его на локальном tomcat на моем компьютере, или если я запустил приложение на tomcat через eclipse ee, чтение PDF файла не вызывает проблем.

Моя проблема

  • Я настроил себе небольшой сервер (не лучшее оборудование, двухъядерный процессор, 4g ram), установил tomcat, java и остальное, что мне казалось нужным.
  • Когда я сейчас разворачиваю военный файл на серверах tomcat с помощью диспетчера tomcat, все работает нормально, пока я не попробую приложение прочитать PDF файл.
  • После того, как приложение прочитало несколько страниц, я получаю сообщение об ошибке, которое CodeCache заполнило, и компиляция была отключена из-за этого.

Пример вывода ошибки во время импорта PDF

В этом журнале показано, как импортируется pdf, а в некоторых случаях запускаются сообщения об ошибках. Я отметил сообщение об эррр-сообщении.

...

31 мая 2012 г. 11:15:40 infovis.structure.pdf.PDFImport process INFO: Обработка Page 13

31 мая 2012 г. 11:15:40 infovis.structure.pdf.PDFImport process INFO: Обработка Page 14

31 мая 2012 г. 11:15:41 infovis.structure.pdf.PDFImport process INFO: Обработка Page 15

Предупреждение VM на 64-битном сервере Java HotSpot (TM): CodeCache заполнен. Компилятор отключен. Предупреждение виртуальной машины Java HotSpot (TM) 64-разрядного сервера: попробуйте увеличить размер кеша кода с помощью -XX: ReservedCodeCacheSize = кодовый кэш [0x00007fa43437e000, 0x00007fa4347e000, 0x00007fa43737e000) total_blobs = 1858 nmethods = 1318 адаптеры = 490 free_code_cache = 44631Kb most_free_block = 45618688 Java HotSpot (TM) 64-битное предупреждение сервера VM: CodeCache заполнен. Компилятор отключен. Предупреждение виртуальной машины на сервере Java HotSpot (TM): попробуйте увеличить размер кеша кода, используя -XX: ReservedCodeCacheSize = Кодовый кэш [0x00007fa43437e000, 0x00007fa4377e000, 0x00007fa43737e000) total_blobs = 1859 nmethods = 1318 адаптеры = 490 free_code_cache = 44631Kb most_free_block = 45618688

31 мая 2012 г. 11:16:19 infovis.structure.pdf.PDFImport process INFO: Обработка Page 16

31 мая 2012 г. 11:16:20 infovis.structure.pdf.PDFImport process INFO: Обработка Page 17

Предупреждение VM на 64-битном сервере Java HotSpot (TM): CodeCache заполнен. Компилятор отключен. Предупреждение виртуальной машины на сервере Java HotSpot (TM): попробуйте увеличить размер кеша кода, используя -XX: ReservedCodeCacheSize = кодовый кэш [0x00007fa43437e000, 0x00007fa43737e000) total_blobs = 1860 nmethods = 1318 адаптеры = 490 free_code_cache = 44630Kb most_free_block = 45618688 31 мая 2012 г. 11:17:07 infovis.structure.pdf.PDFImport process INFO: Обработка Предупреждение VM-сервера на базе Java HotSpot (TM): CodeCache заполнен. Компилятор отключен. Предупреждение виртуальной машины Java HotSpot (TM) 64-битное серверное: попробуйте увеличить размер кеша кода с помощью -XX: ReservedCodeCacheSize = кодовый кэш [0x00007fa43437e000, 0x00007fa4347fe000, 0x00007fa43737e000) total_blobs = 1861 nmethods = 1318 адаптеры = 490 free_code_cache = 44633Kb most_free_block = 45618688

и т.д.

Что я пробовал до сих пор

Я попытался изменить размеры кеша в конфигурации tomcat на моем сервере (я не лучший в работе с оболочкой linux). Я попытался увеличить размер CodeCache, а также размер других кешей, но проблема все еще возникает. Я проверил свой код на возможные утечки, но пока не нашел (помните, если я начну его через eclipse, я не получу это сообщение, так что это может указывать на проблему конфигурации tomcat (?)). Я также попытался установить параметр "UseCodeCacheFlushing", который должен содержать, чтобы очистить кодек, когда он становится заполненным, но каким-то образом он не влияет на пробой приложений.

Конфигурация моего сервера tomcat

Я читал, что размер CodeCache по умолчанию составляет 32 МБ или 64 МБ, когда он является 64-разрядным приложением. Я попытался зарезервировать 512mb (возможно, я сделал что-то не так в конфигурации?), Но проблема, конечно, повторилась.

Здесь вы можете передать параметры запуска JVM в Java. Если это невозможно, Параметры по умолчанию: -Djava.awt.headless = true -Xmx128m -XX: + UseConcMarkSweepGC

Используйте "-XX: + UseConcMarkSweepGC", чтобы включить сборщик мусора CMS (улучшенное время отклика). Если вы используете этот параметр, и вы запускаете Tomcat on машина с ровно одним чипом CPU, который содержит один или два ядра, вы также должны добавить параметр "-XX: + CMSIncrementalMode". JAVA_OPTS = "- Djava.awt.headless = true -Xmx3g -Xms2g -XX: + UseCodeCacheFlushing -XX: + UseG1GC -XX: MaxPermSize = 512m -XX: ReservedCodeCacheSize = 512m

Мои мысли на этом

Во время моего исследования я нашел несколько замечаний о том, что связанные с CodeCache проблемы могут указывать на проблемы с утечкой памяти при сбое программирования, в результате чего сборщик мусора не может очистить кеш. Этот может быть доступен и, к сожалению, у меня нет исходного кода библиотеки, в которой я читал pdf. Но, с другой стороны, у меня нет проблем с чтением 650-страничного pdf файла на моем настольном ПК на локальном tomcat (quadcore, 4x 3.0ghz, также 4g ram), и это меня смущает.

Может быть, это просто проблема с tomcat, которая может быть решена, если я использую другой сервер для развертывания, например, стеклянную рыбку?

Может кто-нибудь из вас поможет мне или имеет какие-либо идеи или предложения? Может, я неправильно настроил конфигурацию? Я не настолько опытен в работе с tomcat или другими серверами, поэтому любая помощь действительно приветствуется.

Большое спасибо за каждый ответ и подумал, что вы делитесь со мной.

Ответ 1

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

После этого коммутатора я никогда не пересматривал это поведение CodeCache.

Чтобы убедиться, что эта проблема решена, я также заметил, что java-vm работает на моем сервере (используя jconsole with remote). Я больше не видел никаких подозрительных действий.

Ответ 2

Попробуйте использовать другой JVM, такой как JRockit, где у вас не должно быть этой проблемы. Если это Tomcat - попробуйте посмотреть, если он регистрирует что-то о утечках в своих журналах - обычно это делается для проблем с загрузчиками классов.