tags:

views:

733

answers:

3

The sun JVM spits out a LOT of extra noise when run under valgrind, which makes tracking memory problems in the application very challenging.

I'd like to find either a suppression file, or a VM runtime mode, that will strip out spurious memory errors in order to separate the wheat from the chaff in this situation. Any suggestions?

+1  A: 

What about profiling this native code outside of the Java application? Usually the JNI code is a wrapper around some library that is not Java specific. Not sure if that is true for your specific case, but if it is then maybe the memory problems can be isolated by writing a plain C or C++ test framework around that library?

If your framework is in C++ then you might also be able to supply your own new and delete operators and track memory usage yourself. You'll have to collect statistics and process them with some scripts but it can work well.

St3fan
+1  A: 

I can't answer your posted question, but can you elaborate on what problem you're having?

In other words, can you tell us if it is...

  • In the JNI layer and not a JVM object scope issue?
  • A use of free'd memory?
  • A buffer underwrite/overwrite?
  • Other memory corruption?

I recently had to debug a Java/C that had issues (after 30+ minutes into its run), which it turns out was using memory after it had been free'd. I tried using dmalloc, a custom memory leak library of mine, Valgrind and none worked as I needed.

Eventually I created a simple set of wrappers around free, malloc, calloc, realloc that simply printed memory addresses and sizes to a file. After it aborted (within GDB) I could backtrack in time and figure out when the memory was free'd and where the references were that did not get removed.

IF your issue is in C/C++ and you can trap the error in a debugger this might work for you. Yes, it's tedious, but maybe no worse than sifting through megabytes of Valgrind output.

Hope that helps & good luck.

NVRAM
I'm looking to identify leaks proactively, not to track down one that I know exists. I'd rather avoid your situation, actually :) It's kind of a habit for me to run my apps through valgrind before releasing them. The JNI library makes a bit of a hash of that, though.
Chris R
A: 

While not as spiffy as valgrind (based on what I've read), you might try jmap and jhat. These tools allow you to take a snapshot of the running process and see what's going on. I've used this technique for simple memory leaks and it's worked well. However, if the memory problems are caused by non-jvm allocations, this won't help.

jdigital