On the project I work on, we've used the cobertura plugin in our Jenkins setup 
and have seen it work quite successfully. As the code base has grown, suddenly 
the instrument phase stopped working causing the build to break. The error we 
see is:

java.lang.OutOfMemoryError: PermGen space

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Unable to instrument project.
[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: Unable to instrument 
project.
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkProjectLifecycle(DefaultLifecycleExecutor.java:1205)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkLifecycle(DefaultLifecycleExecutor.java:1038)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:643)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
        at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:6
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.maven.plugin.MojoExecutionException: Unable to instrument
        at org.codehaus.mojo.cobertura.tasks.InstrumentTask.execute(InstrumentTa
        at org.codehaus.mojo.cobertura.CoberturaInstrumentMojo.execute(Cobertura
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPlugi
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(Defa
        ... 21 more


The stack trace for the maven process showed that a thread had launched another 
unix process as follows:

"main" prio=10 tid=0x000000004dc0e800 nid=0x6371 in Object.wait() 
[0x0000000040208000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00002aab4b0adfc0> (a java.lang.UNIXProcess)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.UNIXProcess.waitFor(UNIXProcess.java:165)
        - locked <0x00002aab4b0adfc0> (a java.lang.UNIXProcess)
        at 
org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:173)
        at 
org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:107)
        at 
org.codehaus.mojo.cobertura.tasks.AbstractTask.executeJava(AbstractTask.java:240)
        at 
org.codehaus.mojo.cobertura.tasks.InstrumentTask.execute(InstrumentTask.java:139)
        at 
org.codehaus.mojo.cobertura.CoberturaInstrumentMojo.execute(CoberturaInstrumentMojo.java:162)
        at 
org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkProjectLifecycle(DefaultLifecycleExecutor.java:1205)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkLifecycle(DefaultLifecycleExecutor.java:1038)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:643)
       at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
        at 
org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
        at 
org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)

a "ps" command showed the following processes:

rio       8466 25455 69 09:53 pts/9    00:00:43 
/apps/rio/java/jdk1.6.0_16/jre/bin/java 
-Dlog4j.configuration=file:/tmp/log4j2167877154140163456config.properties 
-Xmx2g net.sourceforge.cobertura.instrument.Main --commandsfile 
/tmp/cobertura.2442776268684354806.cmdline
rio      10541  3350  0 09:54 pts/1    00:00:00 grep 25455
rio      25455  9484 24 09:45 pts/9    00:02:09 
/apps/rio/java/jdk1.6.0_16/bin/java -Xms2g -Xmx2g -XX:PermSize=1g 
-Dmaven.repo.local=/local/rio/cache4/maven/m2-repo -classpath 
/apps/rio/apache-maven-2.2.1/boot/classworlds-1.1.jar 
-Dclassworlds.conf=/apps/rio/apache-maven-2.2.1/bin/m2.conf 
-Dmaven.home=/apps/rio/apache-maven-2.2.1 org.codehaus.classworlds.Launcher 
"-e" "-Dmri.skip.test=false" "-Djava.awt.headless=true" "clean" 
"cobertura:cobertura"

It seems clear that the "net.sourceforge.cobertura.instrument.Main" jvm is 
running out of PermGen space. I was looking for some kind of hook to add a 
"-XX:PermSize" argument but after looking at the source code for 
org.codehaus.mojo.cobertura.tasks.AbstractTask.executeJava, it seems like there 
is no way to add the additional arg. Can some mechanism be created to do that 
or did I miss something?



This email is confidential and subject to important disclaimers and conditions 
including on offers for the purchase or sale of securities, accuracy and 
completeness of information, viruses, confidentiality, legal privilege, and 
legal entity disclaimers, available at 
http://www.jpmorgan.com/pages/disclosures/email.

Reply via email to