--- old/src/share/vm/oops/constantPool.cpp 2017-06-29 15:57:40.972560236 -0700 +++ new/src/share/vm/oops/constantPool.cpp 2017-06-29 15:57:40.784553008 -0700 @@ -32,6 +32,7 @@ #include "interpreter/linkResolver.hpp" #include "memory/heapInspection.hpp" #include "memory/metadataFactory.hpp" +#include "memory/metaspaceClosure.hpp" #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" #include "oops/constantPool.hpp" @@ -47,9 +48,9 @@ #include "utilities/copy.hpp" ConstantPool* ConstantPool::allocate(ClassLoaderData* loader_data, int length, TRAPS) { - Array* tags = MetadataFactory::new_writeable_array(loader_data, length, 0, CHECK_NULL); + Array* tags = MetadataFactory::new_array(loader_data, length, 0, CHECK_NULL); int size = ConstantPool::size(length); - return new (loader_data, size, true, MetaspaceObj::ConstantPoolType, THREAD) ConstantPool(tags); + return new (loader_data, size, MetaspaceObj::ConstantPoolType, THREAD) ConstantPool(tags); } #ifdef ASSERT @@ -107,6 +108,26 @@ unreference_symbols(); } +void ConstantPool::metaspace_pointers_do(MetaspaceClosure* it) { + log_trace(cds)("Iter(ConstantPool): %p", this); + + it->push(&_tags, MetaspaceClosure::_writable); + it->push(&_cache); + it->push(&_pool_holder); + it->push(&_operands); + it->push(&_resolved_klasses, MetaspaceClosure::_writable); + + for (int i = 0; i < length(); i++) { + // The only MSO's embedded in the CP entries are Symbols: + // JVM_CONSTANT_String (normal and pseudo) + // JVM_CONSTANT_Utf8 + constantTag ctag = tag_at(i); + if (ctag.is_string() || ctag.is_utf8()) { + it->push(symbol_at_addr(i)); + } + } +} + objArrayOop ConstantPool::resolved_references() const { return (objArrayOop)JNIHandles::resolve(_cache->resolved_references()); } @@ -153,7 +174,7 @@ // UnresolvedKlass entries that are temporarily created during class redefinition. assert(num_klasses < CPKlassSlot::_temp_resolved_klass_index, "sanity"); assert(resolved_klasses() == NULL, "sanity"); - Array* rk = MetadataFactory::new_writeable_array(loader_data, num_klasses, CHECK); + Array* rk = MetadataFactory::new_array(loader_data, num_klasses, CHECK); set_resolved_klasses(rk); }