Confused by the way an async job is running
I'm testing an async process that I've been running for months and months on CF8 32-bit on a new Windows 2008 64-bit server. It typically runs for about 4-5 hours, with two threads handling data manipulation on two different sets of data. I have logging built in to tell me how long each 500 items in each thread take to process, so I can see at any time where the processes are. The reason I'm testing it on 64-bit is because when this process runs alongside some other bulky ones, it was hitting the 1.5Gb JVM ceiling, so I wanted to give it its own instance with a 3Gb heap in 64-bit.
I've already gone through the drill of updating my JDK (to 1.6.20) per Charlie Arehart's suggestion. What I'm seeing is really weird. The process runs along fine for about two hours, which gets it about halfway through the total number of items to be processed, and the speed is on par or better than it is in 32-bit. Then all of a sudden, it screeches to a crawl, taking 4-5 times as long to process each chunk of items. What's weird is that up to that point, I can see the JVM memory usage in CF Server Monitor, and it's spiky but remaining consistently below the 3Gb ceiling. Right at the point that it slowed down, the memory levels off around 2.1Gb and stops spiking (image attached). I would have expected to see it level off at max memory and get slow, but if there's still almost a gig of memory free and nothing else is running on the server, why is it slowing down? I verified there are no issues on the database servers I'm using, and this has happened exactly the same way twice day, once with the original JDK from CF8.0.1 and once with the new one. I checked the JRUN logs, but there's nothing significant in there.
Does anybody have any suggestions for how to tackle this? Is it worth messing with 64-bit, or should I just create multiple 32-bit instances? Is CF9 any better at this than CF8?

