mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
6962931: move interned strings out of the perm gen
Reviewed-by: never, coleenp, ysr, jwilhelm
This commit is contained in:
parent
1ed31f9194
commit
fe899cc10d
14 changed files with 58 additions and 41 deletions
|
@ -5930,14 +5930,18 @@ void CMSCollector::refProcessingWork(bool asynch, bool clear_all_soft_refs) {
|
|||
}
|
||||
|
||||
{
|
||||
TraceTime t("scrub symbol & string tables", PrintGCDetails, false, gclog_or_tty);
|
||||
// Now clean up stale oops in StringTable
|
||||
StringTable::unlink(&_is_alive_closure);
|
||||
TraceTime t("scrub symbol table", PrintGCDetails, false, gclog_or_tty);
|
||||
// Clean up unreferenced symbols in symbol table.
|
||||
SymbolTable::unlink();
|
||||
}
|
||||
}
|
||||
|
||||
if (should_unload_classes() || !JavaObjectsInPerm) {
|
||||
TraceTime t("scrub string table", PrintGCDetails, false, gclog_or_tty);
|
||||
// Now clean up stale oops in StringTable
|
||||
StringTable::unlink(&_is_alive_closure);
|
||||
}
|
||||
|
||||
verify_work_stacks_empty();
|
||||
// Restore any preserved marks as a result of mark stack or
|
||||
// work queue overflow
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
*/
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "classfile/symbolTable.hpp"
|
||||
#include "gc_implementation/parallelScavenge/cardTableExtension.hpp"
|
||||
#include "gc_implementation/parallelScavenge/gcTaskManager.hpp"
|
||||
#include "gc_implementation/parallelScavenge/generationSizer.hpp"
|
||||
|
@ -439,6 +440,14 @@ bool PSScavenge::invoke_no_policy() {
|
|||
reference_processor()->enqueue_discovered_references(NULL);
|
||||
}
|
||||
|
||||
if (!JavaObjectsInPerm) {
|
||||
// Unlink any dead interned Strings
|
||||
StringTable::unlink(&_is_alive_closure);
|
||||
// Process the remaining live ones
|
||||
PSScavengeRootsClosure root_closure(promotion_manager);
|
||||
StringTable::oops_do(&root_closure);
|
||||
}
|
||||
|
||||
// Finally, flush the promotion_manager's labs, and deallocate its stacks.
|
||||
PSPromotionManager::post_scavenge();
|
||||
|
||||
|
|
|
@ -86,4 +86,21 @@ inline void PSScavenge::copy_and_push_safe_barrier(PSPromotionManager* pm,
|
|||
}
|
||||
}
|
||||
|
||||
class PSScavengeRootsClosure: public OopClosure {
|
||||
private:
|
||||
PSPromotionManager* _promotion_manager;
|
||||
|
||||
protected:
|
||||
template <class T> void do_oop_work(T *p) {
|
||||
if (PSScavenge::should_scavenge(p)) {
|
||||
// We never card mark roots, maybe call a func without test?
|
||||
PSScavenge::copy_and_push_safe_barrier(_promotion_manager, p);
|
||||
}
|
||||
}
|
||||
public:
|
||||
PSScavengeRootsClosure(PSPromotionManager* pm) : _promotion_manager(pm) { }
|
||||
void do_oop(oop* p) { PSScavengeRootsClosure::do_oop_work(p); }
|
||||
void do_oop(narrowOop* p) { PSScavengeRootsClosure::do_oop_work(p); }
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSSCAVENGE_INLINE_HPP
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#include "gc_implementation/parallelScavenge/psMarkSweep.hpp"
|
||||
#include "gc_implementation/parallelScavenge/psPromotionManager.hpp"
|
||||
#include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp"
|
||||
#include "gc_implementation/parallelScavenge/psScavenge.hpp"
|
||||
#include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
|
||||
#include "gc_implementation/parallelScavenge/psTasks.hpp"
|
||||
#include "memory/iterator.hpp"
|
||||
#include "memory/universe.hpp"
|
||||
|
@ -46,24 +46,6 @@
|
|||
// ScavengeRootsTask
|
||||
//
|
||||
|
||||
// Define before use
|
||||
class PSScavengeRootsClosure: public OopClosure {
|
||||
private:
|
||||
PSPromotionManager* _promotion_manager;
|
||||
|
||||
protected:
|
||||
template <class T> void do_oop_work(T *p) {
|
||||
if (PSScavenge::should_scavenge(p)) {
|
||||
// We never card mark roots, maybe call a func without test?
|
||||
PSScavenge::copy_and_push_safe_barrier(_promotion_manager, p);
|
||||
}
|
||||
}
|
||||
public:
|
||||
PSScavengeRootsClosure(PSPromotionManager* pm) : _promotion_manager(pm) { }
|
||||
void do_oop(oop* p) { PSScavengeRootsClosure::do_oop_work(p); }
|
||||
void do_oop(narrowOop* p) { PSScavengeRootsClosure::do_oop_work(p); }
|
||||
};
|
||||
|
||||
void ScavengeRootsTask::do_it(GCTaskManager* manager, uint which) {
|
||||
assert(Universe::heap()->is_gc_active(), "called outside gc");
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue