--- old/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/HeapRegionSetBase.java 2014-02-11 11:34:03.897495784 +0100 +++ new/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/HeapRegionSetBase.java 2014-02-11 11:34:03.817495783 +0100 @@ -40,12 +40,8 @@ // Mirror class for HeapRegionSetBase. Represents a group of regions. public class HeapRegionSetBase extends VMObject { - // uint _length; - static private CIntegerField lengthField; - // uint _region_num; - static private CIntegerField regionNumField; - // size_t _total_used_bytes; - static private CIntegerField totalUsedBytesField; + + static private long countField; static { VM.registerVMInitializedObserver(new Observer() { @@ -58,23 +54,16 @@ static private synchronized void initialize(TypeDataBase db) { Type type = db.lookupType("HeapRegionSetBase"); - lengthField = type.getCIntegerField("_length"); - regionNumField = type.getCIntegerField("_region_num"); - totalUsedBytesField = type.getCIntegerField("_total_used_bytes"); + countField = type.getField("_count").getOffset(); } - public long length() { - return lengthField.getValue(addr); - } - public long regionNum() { - return regionNumField.getValue(addr); + public HeapRegionSetCount count() { + Address countFieldAddr = addr.addOffsetTo(countField); + return (HeapRegionSetCount) VMObjectFactory.newObject(HeapRegionSetCount.class, + countFieldAddr); } - - public long totalUsedBytes() { - return totalUsedBytesField.getValue(addr); - } - + public HeapRegionSetBase(Address addr) { super(addr); } --- old/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java 2014-02-11 11:34:03.897495784 +0100 +++ new/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java 2014-02-11 11:34:03.817495783 +0100 @@ -114,7 +114,8 @@ long survivorRegionNum = g1mm.survivorRegionNum(); HeapRegionSetBase oldSet = g1h.oldSet(); HeapRegionSetBase humongousSet = g1h.humongousSet(); - long oldRegionNum = oldSet.regionNum() + humongousSet.regionNum(); + long oldRegionNum = oldSet.count().length() + + humongousSet.count().capacity() / HeapRegion.grainBytes(); printG1Space("G1 Heap:", g1h.n_regions(), g1h.used(), g1h.capacity()); System.out.println("G1 Young Generation:"); --- old/src/share/vm/gc_implementation/g1/heapRegionSet.cpp 2014-02-11 11:34:03.897495784 +0100 +++ new/src/share/vm/gc_implementation/g1/heapRegionSet.cpp 2014-02-11 11:34:03.817495783 +0100 @@ -91,9 +91,9 @@ total_capacity_bytes()); } -HeapRegionSetBase::HeapRegionSetBase(const char* name, bool humongous, bool empty, bool linked, HRSMtSafeChecker* mt_safety_checker) +HeapRegionSetBase::HeapRegionSetBase(const char* name, bool humongous, bool empty, HRSMtSafeChecker* mt_safety_checker) : _name(name), _verify_in_progress(false), - _is_humongous(humongous), _is_empty(empty), _is_linked(linked), _mt_safety_checker(mt_safety_checker), + _is_humongous(humongous), _is_empty(empty), _mt_safety_checker(mt_safety_checker), _count() { } --- /dev/null 2014-01-17 12:47:50.437859547 +0100 +++ new/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/HeapRegionSetCount.java 2014-02-11 11:34:03.817495783 +0100 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +package sun.jvm.hotspot.gc_implementation.g1; + +import java.util.Iterator; +import java.util.Observable; +import java.util.Observer; + +import sun.jvm.hotspot.debugger.Address; +import sun.jvm.hotspot.runtime.VM; +import sun.jvm.hotspot.runtime.VMObject; +import sun.jvm.hotspot.runtime.VMObjectFactory; +import sun.jvm.hotspot.types.AddressField; +import sun.jvm.hotspot.types.CIntegerField; +import sun.jvm.hotspot.types.Type; +import sun.jvm.hotspot.types.TypeDataBase; + +// Mirror class for HeapRegionSetCount. Represents a group of regions. + +public class HeapRegionSetCount extends VMObject { + + static private CIntegerField lengthField; + static private CIntegerField capacityField; + + static { + VM.registerVMInitializedObserver(new Observer() { + public void update(Observable o, Object data) { + initialize(VM.getVM().getTypeDataBase()); + } + }); + } + + static private synchronized void initialize(TypeDataBase db) { + Type type = db.lookupType("HeapRegionSetCount"); + + lengthField = type.getCIntegerField("_length"); + capacityField = type.getCIntegerField("_capacity"); + } + + public long length() { + return lengthField.getValue(addr); + } + + public long capacity() { + return capacityField.getValue(addr); + } + + public HeapRegionSetCount(Address addr) { + super(addr); + } +} --- old/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/G1CollectedHeap.java 2014-02-11 11:34:03.941495785 +0100 +++ new/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/G1CollectedHeap.java 2014-02-11 11:34:03.817495783 +0100 @@ -51,9 +51,9 @@ static private CIntegerField summaryBytesUsedField; // G1MonitoringSupport* _g1mm; static private AddressField g1mmField; - // OldRegionSet _old_set; + // HeapRegionSet _old_set; static private long oldSetFieldOffset; - // HumongousRegionSet _humongous_set; + // HeapRegionSet _humongous_set; static private long humongousSetFieldOffset; static { --- old/src/share/vm/gc_implementation/g1/heapRegionSet.hpp 2014-02-11 11:34:03.945495785 +0100 +++ new/src/share/vm/gc_implementation/g1/heapRegionSet.hpp 2014-02-11 11:34:03.817495783 +0100 @@ -84,7 +84,6 @@ private: bool _is_humongous; bool _is_empty; - bool _is_linked; HRSMtSafeChecker* _mt_safety_checker; protected: @@ -109,8 +108,6 @@ // not. Only used during verification. bool regions_empty() { return _is_empty; } - bool regions_linked() { return _is_linked; } - bool check_mt_safety() { if (_mt_safety_checker != NULL) { _mt_safety_checker->check(); @@ -120,7 +117,7 @@ virtual void fill_in_ext_msg_extra(hrs_ext_msg* msg) { } - HeapRegionSetBase(const char* name, bool humongous, bool empty, bool linked, HRSMtSafeChecker* mt_safety_checker); + HeapRegionSetBase(const char* name, bool humongous, bool empty, HRSMtSafeChecker* mt_safety_checker); public: const char* name() { return _name; } @@ -192,7 +189,7 @@ class HeapRegionSet : public HeapRegionSetBase { public: HeapRegionSet(const char* name, bool humongous, HRSMtSafeChecker* mt_safety_checker): - HeapRegionSetBase(name, humongous, false /* empty */, false /* linked */, mt_safety_checker) { } + HeapRegionSetBase(name, humongous, false /* empty */, mt_safety_checker) { } void bulk_remove(const HeapRegionSetCount& removed) { _count.decrement(removed.length(), removed.capacity()); @@ -224,7 +221,7 @@ public: FreeRegionList(const char* name, HRSMtSafeChecker* mt_safety_checker): - HeapRegionSetBase(name, false /* humongous */, true /* empty */, true /* linked */, mt_safety_checker) { + HeapRegionSetBase(name, false /* humongous */, true /* empty */, mt_safety_checker) { clear(); }