RFR (M): (7u60): Backport of 8027476: Improve performance of Stringtable unlink, 8027455: Improve symbol table scan times during gc pauses

Thomas Schatzl thomas.schatzl at oracle.com
Tue Jan 28 10:57:33 UTC 2014


Hi,

  I got the link for the new webrev wrong, taking two from the original
patch. Sorry.

On Tue, 2014-01-28 at 10:51 +0100, Thomas Schatzl wrote:
> Hi all,
> 
>   could I have reviews for the following backport of the symbol table/
> string table parallelization change?
> 
> It implements parallelization of string table and symbol table scan
> during G1 full GC and remark for 7u60.
> 
> There is some difference in the patches due to how 7u60 managing the
> iteration over the string table:
> 
> - 7u60 has no StringTable/StringTable::unlink_or_oops_do() methods,
> but only separate StringTable/SymbolTable::unlink() and
> StringTable/SymbolTable::oops_do() methods.
> 
> - 7u60 allows sharing of strings using CDS, making minor changes
> necessary.

In particular, in StringTable::buckets_unlink(), the code that considers
shared strings need to be kept alive, i.e. in
http://cr.openjdk.java.net/~tschatzl/8027476.7u60/webrev/src/share/vm/classfile/symbolTable.cpp.frames.html , in the right (new) version the following code.

 820       // Shared entries are normally at the end of the bucket and
if we run into
 821       // a shared entry, then there is nothing more to remove. However, if we
 822       // have rehashed the table, then the shared entries are no longer at the
 823       // end of the bucket.
 824       if (entry->is_shared() && !use_alternate_hashcode()) {
 825         break;
 826       }
 827       assert(entry->literal() != NULL, "just checking");
 828       if (entry->is_shared() ||
is_alive->do_object_b(entry->literal())) {

In 8u20/9 the corresponding code is just:

http://cr.openjdk.java.net/~tschatzl/8027476/webrev.1/src/share/vm/classfile/symbolTable.cpp.frames.html , again, right frame:

 835       assert(!entry->is_shared(), "CDS not used for the
StringTable");
 836 
 837       if (is_alive->do_object_b(entry->literal())) {

Automatic merge got confused and simply did not take this difference
into account. I hope this clears this recent, rather cryptic comment up.

> These differences are contained in symbolTable.?pp, the rest is
> verbatim backport iirc.
> 
> New webrev:
> http://cr.openjdk.java.net/~tschatzl/8027476/webrev

Correct webrev is at:

http://cr.openjdk.java.net/~tschatzl/8027476.7u60/webrev

> Old Webrev:
> http://cr.openjdk.java.net/~tschatzl/8027476/webrev.1
> 
> CRs:
> https://bugs.openjdk.java.net/browse/JDK-8027455
> https://bugs.openjdk.java.net/browse/JDK-8027476
> 
> Testing:
> jtreg test case, jprt, FMW apps
> 
> Thanks,
>   Thomas

Sorry,
  Thomas




More information about the hotspot-gc-dev mailing list