[Swift-devel] Tracking swift heap overflow culprit

Mihael Hategan hategan at mcs.anl.gov
Thu Jan 30 21:53:10 CST 2014


On Thu, 2014-01-30 at 19:02 -0600, Michael Wilde wrote:
> > >
> > > [yadunand at midway001 data_stress]$ jmap -histo:live 31135 | head -n 10
> > >
> > >  num     #instances         #bytes  class name
> > > ----------------------------------------------
> > >    1:       1000001       56000056  org.griphyn.vdl.mapping.DataNode
> > >    2:       1030601       32979232  java.util.HashMap$Entry
> > >    3:       2014652       32234432  java.lang.Integer
> > >    4:       1000015       24000360  org.griphyn.vdl.type.impl.FieldImpl
> > >    5:         14672        4903992  [Ljava.util.HashMap$Entry;
> > >    6:         29872        4149184  <constMethodKlass>
> > >    7:         29872        3831968  <methodKlass>

Some specific comments:

1. You need a DataNode for each swift piece of data.
2. Arrays are sparse and implemented as a map, so for each element of an
array you will have a HashMap$Entry.
3. A little too many. I've updated some code to try to avoid
instantiating Integer objects if not necessary (using Integer.valueOf
will typically use existing objects for small numbers). Unfortunately,
if you have 1,000,000 different integer values, you will end up with
1,000,000 integers. One can probably implement a version of DataNode
that is specialized for primitive values to eliminate that part.
4. Unfortunately array indices are treated as "fields" (i.e. a[1] is
treated as a.1). For structures, field instances are cached, but for
arrays, since they have different indices, not so much.
5. Every HashMap has an array of HashMap$Entry objects.
6&7. constant space stuff.

Mihael




More information about the Swift-devel mailing list