I have Java program that, over about 16 hours, is slowly filling the heap with integer arrays that the GC is not getting rid of.
I only have VisualVM available to diagnose the problem, which is how I found that it’s int[]
that is filling the heap.
Any ideas how I can find the source of the int[]
creation?
I’m new to using the profiler so maybe I missed that function but I’ve used it’s heap dump, snapshot, and profiler to look at this and all it’s telling me is that int[]
is in high use.
Advertisement
Answer
In VisualVM you can find the references to objects. This should give you a clue about what part of your program that is leaking those int arrays.
Instructions:
Let your program run for a long time, so that there are many leaked int array instances on the heap for you to find.
Make a heap dump in VisualVM: Main menu > Applications > Heap Dump. A heap dump tab should open.
In the heap dump tab, click the Summary field and change it to Objects. A list of the types of heap objects should open.
Expand the
int[]
entry to see a list of instances.Expand one of the instances.
Expand the references entry.
A list of fields with references to that int array instance will open. The information here might give you a clue.
Repeat step 5-6 for different instances until you find one of the leaked arrays.
The following image shows the references to an int array in a heap dump of my Eclipse.
In this example the int array instance was stored in the valueTable
field of some internal Eclipse OffsetTable
class, which in turn was used by a RegistryObjectManager
.