RFR (XS): 8014405: G1: PerRegionTable::fl_mem_size() calculates size of the free list using wrong element sizes

Thomas Schatzl thomas.schatzl at oracle.com
Fri May 17 06:58:01 UTC 2013


Hi,

On Fri, 2013-05-17 at 08:04 +0200, Bengt Rutisson wrote:
> Hi Thomas,
> 
> On 5/16/13 5:00 PM, Thomas Schatzl wrote:
> > Hi,
> >
> > On Thu, 2013-05-16 at 16:19 +0200, Bengt Rutisson wrote:
> >> Hi Thomas,
> >>
> >> The code change looks good.
> >>
> >> I'm a little concerned about the test. Isn't there a risk that the VM
> >> will crash if it keeps running after the tests are complete since you
> >> have added the dummy PerRegionTable to the free list?
> > No. If you use a different GC than G1 it does not matter, you have the
> > "memory" leak I was talking about.
> 
> Right. But the memory leak does not worry me too much. It is small and 
> limited.
> 
> > If it is G1, the next time a PerRegionTable is allocated, it will be
> > reinitialized with a correct HeapRegion pointer anyway.
> 
> Yes, this is what worries me a bit. You add a "dummy" PRT to the free 
> list. Then when G1 starts running and needs a PRT this dummy PRT will be 
> the first one to be used. It will be re-initialized in 
> PerRegionTable::alloc(), as you say, but this seems scary to me. The 
> test manipulates the data structures that we will use at runtime. I 

The test already manipulates the free list pointer.

> would much prefer that the test cleaned up after itself. Maybe something 

Me too :)

> like:
> 
> void PerRegionTable::test_fl_mem_size() {
>    PerRegionTable* dummy = alloc(NULL);
>    free(dummy);
>    guarantee(dummy->mem_size() == fl_mem_size(), "fl_mem_size() does not 
> return the correct element size");
> 
>    _free_list = NULL;
>    delete dummy;
> }
> 
> I realize that this will still leak the memory for the bitmap allocated 
> by the PRT since there is no decent destructor for the PRT, but as I 
> said I'm less worried about leaking memory than putting the VM in a 
> strange state because of the test.

Okay, I don't mind that way, although as mentioned it does not seem to
be much different.

> I don't think we need the check for G1 that you added in the second 
> review request. It is more important that we make sure that this test is 
> run than that we avoid a small memory leak.

I will remove the check then. It was a suggestion.

> >> It also seems a bit risky to use NULL for the heap region to pass to
> >> alloc(). It works since no one checks for NULL or tries to use it, but
> >> it feels a bit unstable.
> > I do not think there is a risk as the allocating thread is responsible
> > for using/not using any method of the PerRegionTable that uses the
> > HeapRegion reference. As soon as the PerRegionTable is allocated
> > (owned), no other owner can access it.
> >
> > I had the impression that these unit tests run before control is passed
> > to the java program. So at this point there can be no one trying to mess
> > around with the free list.
> >
> > You are right that it relies on knowledge of the internals of the
> > alloc() method and the constructor of the PerRegionTable, but I do not
> > see a way to avoid it. We are somewhat tied to the class by the single
> > static free list pointer.
> 
> Yes, it is this internal knowledge that worries me. It does not seem 
> unreasonable for someone to add a check in methods like alloc() or 
> free() that checks that the new or old HR is consistent in some way.
> 
> However, there are no such checks now, so I guess it is fine to use NULL.

The problem I see is that for a real proper, independent test we would
need to mock an entire G1CollectedHeap and associated data structures
(e.g. policy, HeapRegions, etc).

There is no infrastructure for doing so at all. I believe this
definitely extends the scope of this CR :)

> >> I think the test() method could have a more descriptive name. Maybe
> >> test_fl_mem_size()? Finally, I think most other modules that use the
> > Okay, will do.
> >
> >> ExecuteInternalVMTests "framework" add the test methods to a section at
> >> the bottom of the file. Do you think it is worth following this
> >> convention and moving your test method to the end of the file?
> > You mean PerRegionTable::test_fl_mem_size()? I will do that, but I
> > thought at the end of the class would be sufficient.
> 
> I looked at your second webrev and you have addressed these comments. 
> Thanks!

I will send another later today addressing your comments. Thanks.

Thomas





More information about the hotspot-gc-dev mailing list