Моя ситуация
- Я разработал веб-сервис для анализа документов.
- Этот веб-сервис читает документы 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 или другими серверами, поэтому любая помощь действительно приветствуется.
Большое спасибо за каждый ответ и подумал, что вы делитесь со мной.