RFR (M): 8217778: StringTable cleanup miscalculates amount of dead objects

coleen.phillimore at oracle.com coleen.phillimore at oracle.com
Tue Jan 29 18:12:08 UTC 2019



On 1/29/19 4:51 AM, Thomas Schatzl wrote:
> Hi,
>
> On Mon, 2019-01-28 at 16:46 -0500, coleen.phillimore at oracle.com wrote:
>> Hi Thomas,  Can you forward the review thread for JDK-8213229?
>    the thread starts at
> http://mail.openjdk.java.net/pipermail/hotspot-gc-dev/2019-January/024474.html
>   , but the interesting part is probably starting here
> http://mail.openjdk.java.net/pipermail/hotspot-gc-dev/2019-January/024649.html
>   .

So this moves StringTable processing into the WeakProcessor.  good! Not 
a review though.

http://cr.openjdk.java.net/~tschatzl/8217778/webrev/src/hotspot/share/gc/shared/weakProcessor.inline.hpp.frames.html

If these Counting closures are only used in the weakProcessor.cpp file, 
they should be defined there.  It looks like their use was moved.

http://cr.openjdk.java.net/~tschatzl/8217778/webrev/src/hotspot/share/gc/shared/weakProcessor.cpp.frames.html

I don't know what "is_serial does but it doesn't look like you're using 
the num_dead() count when calling processor.

  40     if (WeakProcessorPhases::is_serial(phase)) {
41 CountingIsAliveClosure<BoolObjectClosure> cl(is_alive);
   42       WeakProcessorPhases::processor(phase)(&cl, keep_alive);
   43     } else {
44 CountingSkippedIsAliveClosure<BoolObjectClosure, OopClosure> 
cl(is_alive, keep_alive);
45 WeakProcessorPhases::oop_storage(phase)->oops_do(&cl);
   46       if (WeakProcessorPhases::is_stringtable(phase)) {
47 StringTable::inc_dead_counter(cl.num_dead() + cl.num_skipped());
48 }
   49     }

Thanks,
Coleen

>> I wonder if we could just trigger_unloading after any GC has run and
>> ignore dead string counts.  Are they ever zero?
> That seems to be a waste of cpu cycles assuming that interned strings
> typically have a "long" lifetime.

Since the VM has to intern any strings in the JVM_CONSTANT_String in the 
classfile, class unloading probably should trigger_unloading 
unconditionally if any classes are unloaded.  It seems very likely there 
would be unreferenced strings.

But we may need the ServiceThread to unlink reclaimed entries even if 
classes aren't unloaded, which may be infrequent but there may have been 
stressful applications that have required it in the past.

Can you log if the count is ever too low to process the StringTable?

The change for this looks reasonable, but not a full review.  I kind of 
like keeping the concept of weak_oops_do() because it's a well known 
idiom but as Kim says, it's not necessary to call weak_oops_do on 
something that contains weak oops.

CR:
https://bugs.openjdk.java.net/browse/JDK-8217778
Webrev:
http://cr.openjdk.java.net/~tschatzl/8217778/webrev/


Thanks,
Coleen
>
> Thanks,
>    Thomas
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20190129/485965b2/attachment.htm>


More information about the hotspot-gc-dev mailing list