janino-compiler / janino

Janino is a super-small, super-fast Java™ compiler.
http://janino-compiler.github.io/janino
Other
1.21k stars 205 forks source link

Constant pool has grown past JVM limit of 0xFFFF #218

Open WZRPW opened 3 months ago

WZRPW commented 3 months ago

I use Janino to compile a generated Java code which has a large number of lines of code,

################################## ClassBodyEvaluator evaluator = new ClassBodyEvaluator(); ..... evaluator.cook(codeFile, codeBody); ##################################

I got this compilation error at runtime: Caused by: org.codehaus.commons.compiler.InternalCompilerException: Compiling “myTestCode” in File '/tmp/myTestCode.java', Line 1, Column 1: File '/tmp/myTestCode.java', Line 8559, Column 265: Compiling "myTestCode(param1, param2, param3, param4)”: File '/tmp/myTestCode.java', Line 8653, Column 5: org.codehaus.commons.compiler.InternalCompilerException: File '/tmp/myTestCode.java', Line 8653, Column 5: Compiling "init()": Constant pool for class myTestCode has grown past JVM limit of 0xFFFF

Could you help me understand what this exception means? Thanks,

WZRPW commented 3 months ago

Does this mean the myTestCode file is too large or the init(), a function, has too many lines of code?

WZRPW commented 3 months ago

OK. I find a stackoverflow thread which gives a well written intro about Java constant pool.

aunkrig commented 3 months ago

In case you're wondering what fills your constant pool, you could set a breakpoint where the exception is thrown and inspect the constant pool.

There are many different constant pool entry types (not only string literals), and you might be able to develop strategies to change your code generation such that you avoid sonstant pool bloat.