sample_eden()

Srinivas Ramakrishna ysr1729 at gmail.com
Mon Jul 29 21:29:00 UTC 2013


ah, makes sense! :-)

So, if the scavenge failed, leaving stuff in Eden and the survivor
spaces, the chunks should still be valid if a CMS collection could
happen.
(I wonder after asking that question, though, how CMS would deal with
such a situation -- two active survivor spaces, i think it deals OK
with it, but not sure if both scans today parallelized or not, or if
the question is moot because the failed scavenge causes a bail out to
a stop-world gc... perhaps the latter?) Probably an academic question,
but still... :-)

- ramki

On Mon, Jul 29, 2013 at 1:46 PM, Jon Masamitsu <jon.masamitsu at oracle.com> wrote:
> Ramki,
>
> This has gotten interesting.  When
>
> 1) a System.gc() is called
>
> and
>
> 2) UseCMSCompactAtFullCollection is set to false
>
> the CMS generation tells GenCollectedHeap that CMS
> does not collect the young gen.  That's right but I hadn't
> appreciated that in that circumstance a young gen GC
> was done before the CMS gen is collected.  Makes sense
> but the GC epilogue code is called after all the generations
> have been collected by GenCollectedHeap so the
> _eden_chunk_index is not reset between the young GC
> and the CMS GC.
>
> I think the right fix is to use the occupancy of eden to
> decide what work we need to do instead of _eden_chunk_index.
>
> Jon
>
>
> On 7/26/13 6:41 PM, Srinivas Ramakrishna wrote:
>>
>> Don't have the code in front of me to check, but yes that would seem to be
>> the thing to do. I thought it was reset in the young gen gc epilogue ...
>>
>> ysr1729
>>
>> On Jul 26, 2013, at 14:46, Jon Masamitsu <jon.masamitsu at oracle.com> wrote:
>>
>>> Hiroshi,
>>>
>>> I'm looking at an assertion failure with CMSParallelInitialMarkEnabled
>>> and CMSEdenChunksRecordAlways both enabled.  The assertion
>>> failure is in do_young_space_rescan()
>>>
>>>   5506      assert(mr.is_empty() || space->used_region().contains(mr),
>>>   5507             "Should be in space");
>>>
>>> and the failure occurs because _eden_chunk_index is > 0 and
>>> eden is empty.
>>>
>>> A young GC has just occurred and a System.gc() is in progress where the
>>> System.gc() is executing the the usual phases of CMS in a stop-the-world
>>> fashion.  A rarely seen scenario I think.  That is, the initial mark is
>>> being
>>> executed.
>>>
>>> I was looking at the places where _eden_chunk_index is reinitialized to
>>> 0.  I don't think you added any in you changes, right?
>>>
>>> I was thinking that _eden_chunk_index should be reset to 0 after
>>> a young GC where we know that eden is empty.  What do you think?
>>>
>>> Jon
>>>
>>>
>>>
>



More information about the hotspot-gc-dev mailing list