Search code examples
javamemorygarbage-collectionheap-memory

Java Memory Leaks


I'm creating a service that will run constantly, each day at a specified time it will run the main body of the program.

Essentially:

while(true){
run();
Thread.sleep(day);
}

After a while, I'm getting OutOfMemoryHeapExceptions. After reading about this a little I'm thinking its because any objects created inside the run() method will never be garbage collected.

Therefore I have done something like:

public void run(){
Object a = new Object();
a.doSomething();

a= null; //Wasn't here before
}

My question is, will this solve my problem? I'm under the impression that once an object is null, the object it previously referenced will be garbage collected? Also is this a good idea? Or should I look at doing something else?

Thanks


Solution

  • Adding a = null will almost certainly be insufficient to fix the problem (since a is about to go out of scope anyway).

    My advice would be to use a memory profiler to pinpoint what's leaking and where.

    I personally use YourKit. It's very good, but costs money (you can get a free evaluation).

    Another recently-released tool is Plumbr. I am yet to try it, but the blurb says:

    Try out our Java agent for timely discovery of memory leaks. We'll tell you what is leaking, where the leak originates from and where the leaked objects currently reside - well before the OutOfMemoryError!