views:

492

answers:

6

Hi, we have a PHP webapp that calls a java binary to produce a pdf report (with jasperreport), the java binary outpus pdf to standart output and exits, the php then send the pdf to browser. This java command lasts about 3 to 6 seconds, I think when it lasts 6 second it's because the GC kicks in, so I would like to disable it because anyway when the command exits all memory is returned..

I would like to know how to disable it for Java 1.4.2 and for Java 1.6.0 because we are currently testing both JVM to see which performs faster..

Thanks

+10  A: 

GC only kicks in when JVM is short on memory, so you either GC or die. Try turning on verbose GC and see if it actually takes significant amount of time.

java -verbose:gc
unbeli
Umm, then maybe I could use a commandline switch to give it more memory and so increase the chance the GC does not kicks in..
Nelson
Yes, you will know if you need to do that after analyzing the output of verbose:gc. That's the first step.
unbeli
+1 for "test, don't guess". The time diff could be something completely unrelated, like I/O contention or some CPU heavy process kicking in.
gustafc
+1  A: 

Are you sure that it is garbage collection causing the slowdown? Have you run java with -verbose:gc to see what is happening?

You cannot disable garbage collection on the JVM. You could however look at tuning the garbage collector for better performance.

Mark
+2  A: 

You can use the -Xmx option to set the maximum heap size; using a larger heap should prevent the VM from runnning out of memory and, thereby, requiring garbage collection so soon.

Michael Aaron Safyan
Just setting -Xmx won't make any difference. You actually need to set -Xms as well since you want to control the initial heap size.
Stephen C
+11  A: 

There is no way to disable garbage collection entirely. Garbage collection is only run when the JVM runs out of space, so you could give the program more memory. Add these command line options to the Java command

-Xmx256M -Xms256M

This gives the program 256Mb of ram (the default is 64Mb). Garbage collection will not take 3 seconds for a default size JVM though, so you might want to investigate more closely what the program is doing. Yourkit profiler (http://www.yourkit.com/) is very useful for figuring out what is taking a long time.

Ceilingfish
+16  A: 

It sounds like you are trying to save time, but going about it the wrong way. The time saved in disabling garbage collection would be trivial (for a single task) compared to the time taken to launch and shutdown the java process. You might want to consider having a java process launch that you can ask multiple times to do the work you require if run-time performance is your goal.

jowierun
Good one... it would save jasper initialization too, I think.
helios
Yes, this is good approach although more work to do, I would have to code a kind of daemon that would listen on sockets and so on.. besides this "daemon" would have to be restarted once in X days.. cause java leaks memory in the long run (from my experience)..
Nelson
@Nelson Consider seeing if you can use something like Mule to host your Java processes and let that handle all of the communications for you. The idea being that you just need to embed your JasperReports as a service that the ESB can host and route requests to as necessary.Mule: http://www.mulesoft.com/mule-esb-open-source-esb
Trevor Tippins
@Nelson Java doesn't leak memory per se. We have java deamons running for months, only restarted for application updates or system downtimes. If your Java programs are leaking, try to use a profiler. There are other options than open the socket yourself. There is ActiveMQ/JMS, JMX, or you could create a webservice for it, maybe jetty would be interesting.
Hardcoded
A: 

As everyone as said you can't disable GC in the JVM, which makes sense right, because if you could there'd be memory leaks due to java not having an explicit way for the developer to delete the heap data.

Do you have access to the source of this java binary? If so it might be worth analysing it and seeing if there's any bottle-necks which could be better written to cut down on GC activity. This could be done with most java profilers, like JProbe for example.

toby
the java binary is very simple, it just retrieve commandline paraemeters and make calls into jasperreport functions to create the report, which is passed to the System.out outputstream where the PHP read it through 'passthrough' function. So the the time is spent on Jasperreport proccessing the report, thats how I wanted a java general speedup.
Nelson
It looks like controlling the JVM GC settings is your only avenue here then.
toby