javatomcatcode-caching

Java and Tomcat - CodeCache is full. Compiler has been disabled


My Situation

My Problem

Example error output during a pdf import

This log shows how the pdf is being imported and on some point the error messages start. I have marked the error message bold.

...

May 31, 2012 11:15:40 AM infovis.structure.pdf.PDFImport process INFO: Processing Page 13

May 31, 2012 11:15:40 AM infovis.structure.pdf.PDFImport process INFO: Processing Page 14

May 31, 2012 11:15:41 AM infovis.structure.pdf.PDFImport process INFO: Processing Page 15

Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= Code Cache [0x00007fa43437e000, 0x00007fa4347fe000, 0x00007fa43737e000) total_blobs=1858 nmethods=1318 adapters=490 free_code_cache=44631Kb largest_free_block=45618688 Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= Code Cache [0x00007fa43437e000, 0x00007fa4347fe000, 0x00007fa43737e000) total_blobs=1859 nmethods=1318 adapters=490 free_code_cache=44631Kb largest_free_block=45618688

May 31, 2012 11:16:19 AM infovis.structure.pdf.PDFImport process INFO: Processing Page 16

May 31, 2012 11:16:20 AM infovis.structure.pdf.PDFImport process INFO: Processing Page 17

Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= Code Cache [0x00007fa43437e000, 0x00007fa4347fe000, 0x00007fa43737e000) total_blobs=1860 nmethods=1318 adapters=490 free_code_cache=44630Kb largest_free_block=45618688 May 31, 2012 11:17:07 AM infovis.structure.pdf.PDFImport process INFO: Processing Page 18 Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= Code Cache [0x00007fa43437e000, 0x00007fa4347fe000, 0x00007fa43737e000) total_blobs=1861 nmethods=1318 adapters=490 free_code_cache=44633Kb largest_free_block=45618688

and so on...

What I have tried so far

I have tried to change the cache sizes in the tomcat configuration on my server (I'm not the best in working with the linux shell). I have tried to increase the CodeCache Size, as well as the size of the other caches but the problem still occurs. I have checked my code for possible leaks but did not find any yet (Remember, if I start it via eclipse I dont get this message, so this might indicate a tomcat(?) configuration problem). I have also tried to set the parameter "UseCodeCacheFlushing" that should enforce to empty the code cache when it's becoming full, but somehow it doesn't effect the applications breakdown.

My tomcat server configuration

I have read that the default CodeCache size is 32MB or 64MB when it's a 64 bit application. I tried reserving 512mb (maybe I did something wrong in the configuration?) but the problem of course happened again.

You may pass JVM startup parameters to Java here. If unset, the default options will be: -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC

Use "-XX:+UseConcMarkSweepGC" to enable the CMS garbage collector (improved response time). If you use that option and you run Tomcat on a machine with exactly one CPU chip that contains one or two cores, you should also add the "-XX:+CMSIncrementalMode" option. JAVA_OPTS="-Djava.awt.headless=true -Xmx3g -Xms2g -XX:+UseCodeCacheFlushing -XX:+UseG1GC -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=512m"

My Thoughts on this

During my research I found some notes that CodeCache related problems may indicate memory leak problems, when there is a programming failure, in which the result is that the garbage collector can't empty the cache. This might be possible and sadly I don't have the source code of the library in which I read the pdf. But on the other hand I have no problems in reading a 650 pages pdf on my desktop pc on a local tomcat (quadcore, 4x 3.0ghz, also 4g ram) and this confuses me.

Could it be that this is just a tomcat problem that can get solved if I use another server for deployment, like glassfish?

Can anyone help me or provide any ideas or suggestions? Maybe I did some configuration wrong? I'm not that experienced in working with tomcat or other servers, so any help is really welcome.

Thanks a lot for every answer and thought that you're sharing with me.


Solution

  • The solution for me was to switch from Tomcat to Glassfish as application server for deploying my application.

    After that switch I never re-experienced this CodeCache behaviour.

    For making sure this problem is solved I also observed the java-vm running on my server (using jconsole with remote). I didn't see any suspicious behaviour anymore.