RFR(L): 8195097: Make it possible to process StringTable outside safepoint
David Holmes
david.holmes at oracle.com
Thu Jun 14 04:59:58 UTC 2018
Hi Robbin and reviewers,
On 5/06/2018 1:15 AM, Robbin Ehn wrote:
> Hi Jiangli,
>
> On 2018-05-30 21:47, Jiangli Zhou wrote:
>> Hi Robbin,
>>
>> I mainly focused on the archived string part during review. Here are
>> my comments, which are minor issues mostly.
>>
>> - stringTable.hpp
>>
>> Archived string is only supported with INCLUDE_CDS_JAVA_HEAP. Please
>> add NOT_CDS_JAVA_HEAP_RETURN_(NULL) for lookup_shared() and
>> create_archived_string() below so their call sites are handled
>> properly when java heap object archiving is not supported.
>>
>> 153 oop lookup_shared(jchar* name, int len, unsigned int hash);
>> 154 static oop create_archived_string(oop s, Thread* THREAD);
>>
>
> Fixed
create_archived_string() was not fixed.
https://bugs.openjdk.java.net/browse/JDK-8205002
Cheers,
David
>> - stringTable.cpp
>>
>> How about renaming CopyArchive to CopyToArchive, so it’s more
>> descriptive?
>
> Fixed
>
>>
>> Looks like the ‘bool’ return type is not needed since we always return
>> with true and the result is not checked. How able changing it to
>> return ‘void’?
>>
>> 774 bool operator()(WeakHandle<vm_string_table_data>* val) {
>>
>
> The scanning done by the hashtable is stopped if we return false here.
> So the return value is used by the hashtable to know if it should
> continue the walk over all items.
>
>>
>> - genCollectedHeap.cpp
>>
>> Based on the assert at line 863, looks like ‘par_state_string’ is not
>> NULL when 'scope->n_threads() > 1’. Maybe the if condition at line 865
>> could be simplified to be just ‘if (scope->n_threads() > 1)’?
>>
>> 862 // Either we should be single threaded or have a ParState
>> 863 assert((scope->n_threads() <= 1) || par_state_string != NULL,
>> "Parallel but not ParState");
>> 864
>> 865 if (scope->n_threads() > 1 && par_state_string != NULL) {
>
> Fixed, I'll send new version to rfr mail.
>
> Thanks, Robbin
>
>>
>>
>> Thanks,
>> Jiangli
>>
>>> On May 28, 2018, at 6:19 AM, Robbin Ehn <robbin.ehn at oracle.com> wrote:
>>>
>>> Hi all, please review.
>>>
>>> This implements the StringTable with the ConcurrentHashtable for
>>> managing the
>>> strings using oopStorage for backing the actual oops via WeakHandles.
>>>
>>> The unlinking and freeing of hashtable nodes is moved outside the
>>> safepoint,
>>> which means GC only needs to walk the oopStorage, either concurrently
>>> or in a
>>> safepoint. Walking oopStorage is also faster so there is a good
>>> effect on all
>>> safepoints visiting the oops.
>>>
>>> The unlinking and freeing happens during inserts when dead weak oops are
>>> encountered in that bucket. In any normal workload the stringtable
>>> self-cleans
>>> without needing any additional cleaning. Cleaning/unlinking can also
>>> be done
>>> concurrently via the ServiceThread, it is started when we have a high
>>> ‘dead
>>> factor’. E.g. application have a lot of interned string removes the
>>> references
>>> and never interns again. The ServiceThread also concurrently grows
>>> the table if
>>> ‘load factor’ is high. Both the cleaning and growing take care to not
>>> prolonging
>>> time to safepoint, at the cost of some speed.
>>>
>>> Kitchensink24h, multiple tier1-5 with no issue that I can relate to this
>>> changeset, various benchmark such as JMH, specJBB2015.
>>>
>>> Issue: https://bugs.openjdk.java.net/browse/JDK-8195097
>>> Webrev: http://cr.openjdk.java.net/~rehn/8195097/v0/webrev/
>>>
>>> Thanks, Robbin
>>
More information about the hotspot-gc-dev
mailing list