in reply to Out of memory using chart::clicker

It seems that Chart::Clicker is creating circular references which perl can't unpick.

Using Chart::Clicker via Catalyst, and +CatalystX::LeakChecker

[debug] Circular reference detected: .--------------------------------------------------------------------- +---. | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[0]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[0]->{component_list}->{compone +n- | | ts}->[0]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[0]->{component_list}->{compone +n- | | ts}->[1]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[0]->{component_list}->{compone +n- | | ts}->[2]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[0]->{component_list}->{compone +n- | | ts}->[3]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[0]->{component_list}->{compone +n- | | ts}->[4]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[0]->{component_list}->{compone +n- | | ts}->[5]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[0]->{component_list}->{compone +n- | | ts}->[6]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[0]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[1]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[2]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[3]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[4]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[5]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[6]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[7]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[8]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[9]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[1]->{component_list}->{compone +n- | | ts}->[10]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[2]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[2]->{component_list}->{compone +n- | | ts}->[0]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[2]->{component_list}->{compone +n- | | ts}->[1]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{component_list}->{components}->[2]->{component_list}->{compone +n- | | ts}->[2]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{grid}->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{render_area}->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{render_area}->{component_list}->{components}->[0]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{render_area}->{component_list}->{components}->[1]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [0]->{render_area}->{component_list}->{components}->[2]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [1]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [1]->{component_list}->{components}->[0]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [1]->{component_list}->{components}->[1]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [1]->{component_list}->{components}->[2]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [1]->{component_list}->{components}->[3]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{component_list}->{components}- +>- | | [2]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{domain_ +a- | | xis}->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{domain_ +a- | | xis}->{component_list}->{components}->[0]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{domain_ +a- | | xis}->{component_list}->{components}->[1]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{domain_ +a- | | xis}->{component_list}->{components}->[2]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{domain_ +a- | | xis}->{component_list}->{components}->[3]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{domain_ +a- | | xis}->{component_list}->{components}->[4]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{domain_ +a- | | xis}->{component_list}->{components}->[5]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{domain_ +a- | | xis}->{component_list}->{components}->[6]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[0]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[1]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[2]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[3]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[4]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[5]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[6]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[7]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[8]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[9]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{range_a +x- | | is}->{component_list}->{components}->[10]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{contexts}->{default}->{rendere +r- | | }->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{legend}->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{legend}->{component_list}->{co +m- | | ponents}->[0]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{legend}->{component_list}->{co +m- | | ponents}->[1]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{legend}->{component_list}->{co +m- | | ponents}->[2]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{legend}->{component_list}->{co +m- | | ponents}->[3]->{layout}->{component} + | | $ctx->{stash}->{graphics_primitive}->{marker_overlay}->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[0]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[0]->{component_list}->{components}->[0]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[0]->{component_list}->{components}->[1]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[0]->{component_list}->{components}->[2]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[0]->{component_list}->{components}->[3]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[0]->{component_list}->{components}->[4]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[0]->{component_list}->{components}->[5]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[0]->{component_list}->{components}->[6]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[0]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[1]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[2]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[3]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[4]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[5]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[6]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[7]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[8]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[9]->{layout}->{compone +n- | | t} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[1]->{component_list}->{components}->[10]->{layout}->{compon +e- | | nt} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[2]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[2]->{component_list}->{components}->[0]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[2]->{component_list}->{components}->[1]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{component_list}->{comp +o- | | nents}->[2]->{component_list}->{components}->[2]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{grid}->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{render_area}->{clicker +} | | $ctx->{stash}->{graphics_primitive}->{plot}->{render_area}->{compone +n- | | t_list}->{components}->[0]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{render_area}->{compone +n- | | t_list}->{components}->[1]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{plot}->{render_area}->{compone +n- | | t_list}->{components}->[2]->{clicker} + | | $ctx->{stash}->{graphics_primitive}->{title}->{layout}->{component} + | '--------------------------------------------------------------------- +---'

Replies are listed 'Best First'.
Re^2: Out of memory using chart::clicker
by djzort (Sexton) on Mar 20, 2014 at 04:59 UTC

    after some fun with Data::Dumper, i have come up with the following. YMMV.

    # hack away at circular references! $chart->{component_list}->{components} = undef; $chart->{'contexts'}{'default'}{'range_axis'}{'parent'}{'component +_list'}{'components'} = undef; $chart->{legend}->{component_list}->{components} = undef; $chart->{plot} = undef; $chart->{contexts}->{default} = undef; $chart->{legend}->{clicker} = undef; $chart->{marker_overlay}->{clicker} = undef; $chart->{title}->{layout}->{component} = undef;
      I've released new versions of Graphics::Primitive (0.65) and Chart::Clicker (2.88) that seek to address this issue. If you still see leaks I'd appreciate another dump form the leakchecker. That was quite helpful.