--- old/src/share/vm/gc/g1/g1StringDedupThread.cpp 2015-05-29 14:23:26.474746571 -0400 +++ new/src/share/vm/gc/g1/g1StringDedupThread.cpp 2015-05-29 14:23:25.634698271 -0400 @@ -23,12 +23,14 @@ */ #include "precompiled.hpp" +#include "classfile/stringTable.hpp" #include "gc/g1/g1Log.hpp" #include "gc/g1/g1StringDedup.hpp" #include "gc/g1/g1StringDedupQueue.hpp" #include "gc/g1/g1StringDedupTable.hpp" #include "gc/g1/g1StringDedupThread.hpp" #include "gc/g1/suspendibleThreadSet.hpp" +#include "oops/oop.inline.hpp" #include "runtime/atomic.inline.hpp" G1StringDedupThread* G1StringDedupThread::_thread = NULL; @@ -55,11 +57,31 @@ return _thread; } +class G1StringDedupSharedClosure: public OopClosure { + private: + G1StringDedupStat& _stat; + + public: + G1StringDedupSharedClosure(G1StringDedupStat& stat) : _stat(stat) {} + + virtual void do_oop(oop* p) { ShouldNotReachHere(); } + virtual void do_oop(narrowOop* p) { + oop java_string = oopDesc::load_decode_heap_oop(p); + G1StringDedupTable::deduplicate(java_string, _stat); + } +}; + +void G1StringDedupThread::deduplicate_shared_strings(G1StringDedupStat& stat) { + G1StringDedupSharedClosure sharedStringDedup(stat); + StringTable::shared_oops_do(&sharedStringDedup); +} + void G1StringDedupThread::run() { G1StringDedupStat total_stat; initialize_in_thread(); wait_for_universe_init(); + deduplicate_shared_strings(total_stat); // Main loop for (;;) {