< prev index next >
src/share/vm/oops/constantPool.cpp
Print this page
*** 30,39 ****
--- 30,40 ----
#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
#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"
#include "oops/instanceKlass.hpp"
#include "oops/objArrayKlass.hpp"
*** 45,57 ****
#include "runtime/signature.hpp"
#include "runtime/vframe.hpp"
#include "utilities/copy.hpp"
ConstantPool* ConstantPool::allocate(ClassLoaderData* loader_data, int length, TRAPS) {
! Array<u1>* tags = MetadataFactory::new_writeable_array<u1>(loader_data, length, 0, CHECK_NULL);
int size = ConstantPool::size(length);
! return new (loader_data, size, true, MetaspaceObj::ConstantPoolType, THREAD) ConstantPool(tags);
}
#ifdef ASSERT
// MetaspaceObj allocation invariant is calloc equivalent memory
--- 46,58 ----
#include "runtime/signature.hpp"
#include "runtime/vframe.hpp"
#include "utilities/copy.hpp"
ConstantPool* ConstantPool::allocate(ClassLoaderData* loader_data, int length, TRAPS) {
! Array<u1>* tags = MetadataFactory::new_array<u1>(loader_data, length, 0, CHECK_NULL);
int size = ConstantPool::size(length);
! return new (loader_data, size, MetaspaceObj::ConstantPoolType, THREAD) ConstantPool(tags);
}
#ifdef ASSERT
// MetaspaceObj allocation invariant is calloc equivalent memory
*** 105,114 ****
--- 106,135 ----
void ConstantPool::release_C_heap_structures() {
// walk constant pool and decrement symbol reference counts
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());
}
// Create resolved_references array and mapping array for original cp indexes
*** 151,161 ****
// entry for the class's name. So at most we will have 0xfffe class entries.
// This allows us to use 0xffff (ConstantPool::_temp_resolved_klass_index) to indicate
// UnresolvedKlass entries that are temporarily created during class redefinition.
assert(num_klasses < CPKlassSlot::_temp_resolved_klass_index, "sanity");
assert(resolved_klasses() == NULL, "sanity");
! Array<Klass*>* rk = MetadataFactory::new_writeable_array<Klass*>(loader_data, num_klasses, CHECK);
set_resolved_klasses(rk);
}
void ConstantPool::initialize_unresolved_klasses(ClassLoaderData* loader_data, TRAPS) {
int len = length();
--- 172,182 ----
// entry for the class's name. So at most we will have 0xfffe class entries.
// This allows us to use 0xffff (ConstantPool::_temp_resolved_klass_index) to indicate
// UnresolvedKlass entries that are temporarily created during class redefinition.
assert(num_klasses < CPKlassSlot::_temp_resolved_klass_index, "sanity");
assert(resolved_klasses() == NULL, "sanity");
! Array<Klass*>* rk = MetadataFactory::new_array<Klass*>(loader_data, num_klasses, CHECK);
set_resolved_klasses(rk);
}
void ConstantPool::initialize_unresolved_klasses(ClassLoaderData* loader_data, TRAPS) {
int len = length();
< prev index next >