--- old/src/hotspot/share/oops/valueKlass.hpp 2017-10-31 09:39:51.200985097 -0400 +++ new/src/hotspot/share/oops/valueKlass.hpp 2017-10-31 09:39:50.976983986 -0400 @@ -155,14 +155,13 @@ void set_if_bufferable() { bool bufferable; - if (contains_oops()) { - bufferable = false; - } else { - int size_in_heap_words = size_helper(); - int base_offset = instanceOopDesc::base_offset_in_bytes(); - size_t size_in_bytes = size_in_heap_words * HeapWordSize - base_offset; - bufferable = size_in_bytes <= BigValueTypeThreshold; - } + + int size_in_heap_words = size_helper(); + int base_offset = instanceOopDesc::base_offset_in_bytes(); + size_t size_in_bytes = size_in_heap_words * HeapWordSize - base_offset; + bufferable = size_in_bytes <= BigValueTypeThreshold; + if (size_in_bytes > VTBufferChunk::max_alloc_size()) bufferable = false; + if (ValueTypesBufferMaxMemory == 0) bufferable = false; if (bufferable) { _extra_flags |= _extra_is_bufferable; } else { @@ -199,6 +198,8 @@ // GC support... + void iterate_over_inside_oops(OopClosure* f, oop value); + // oop iterate raw value type data pointer (where oop_addr may not be an oop, but backing/array-element) template inline void oop_iterate_specialized(const address oop_addr, OopClosureType* closure);