RFR (M): 8136681: Factor out IHOP calculation from G1CollectorPolicy
Jon Masamitsu
jon.masamitsu at oracle.com
Fri Nov 13 15:58:49 UTC 2015
Mikael,
This is partial. If you send out a second webrev based on Mikael's
review, I'll finish with that.
http://cr.openjdk.java.net/~tschatzl/8136681/webrev/src/share/vm/gc/g1/g1CollectedHeap.hpp.frames.html
> 1370 // Returns the number of regions the humongous object of the
> given word size
> 1371 // covers.
"covers" is not quite right since to me it says that the humongous
object completely uses the
region. I'd use "requires".
http://cr.openjdk.java.net/~tschatzl/8136681/webrev/src/share/vm/gc/g1/g1IHOPControl.hpp.html
49 // Update information about recent time during which allocations happened,
50 // how many allocations happened and an additional safety buffer.
// Update information about
I DON'T KNOW WHICH OF THESE IS MORE PRECISE.
// Time during which allocations occurred (sum of mutator execution time + GC pause times)
OR
// Concurrent marking time (concurrent mark end - concurrent mark start)
// Allocations in bytes during that time
// Safety buffer ???
I couldn't figure out what the safety buffer is supposed to be. It seems to
be the young gen size but don't know why.
33 // Manages the decision about the threshold when concurrent marking should start.
// IHOP = Initiating heap occupancy in percent of the entire heap
34 class G1IHOPControl : public CHeapObj<mtGC> {
35 protected:
36 double _ihop_percent;
// Occupancy in bytes. This is always less than or equal to the (maximum or current maximum?) heap occupancy
37 size_t _target_occupancy;
// Most recent complete allocation period (time from first young-only GC to
// end of marking) in seconds. Any period which is interrupted by a full GC
// is ignored.
65 _last_allocation_time_s(0.0),
// Number of bytes allocated during that period (mutator allocation + promotions)
66 _last_allocated_bytes(0),
// Length of most recent marking cycle in seconds
67 _last_marking_length_s(0.0) { }
// Occupany in bytes at which a concurrent marking cycle is started. This count
// includes the waste in regions occupied by humongous objects and waste at
// the end of any old region that is not the currently being used for promotions
// and the waste at the end of survivor regions.
69 size_t get_conc_mark_start_threshold() { return (size_t) (_ihop_percent * _target_occupancy / 100.0); }
This might be better named update_marking_length() but can be done in a later cleanup.
// Update marking length (concurrent marking end - concurret marking start)
77 virtual void update_time_to_mixed(double marking_length_s) {
Have you given much thought to what affect a to-space exhaustion should
have on
IHOP? I understand that it is not the design center for this but I
think that to-space
exhaustion can confuse the statistics. Maybe a reset of the statistics
and a dropping
the IHOP to a small value (current heap occupancy or even 0) until you
get 3 successful
marking cycles. Or think about it later.
Jon
On 11/5/2015 1:42 AM, Thomas Schatzl wrote:
> Hi all,
>
> can I have reviews for this preparatory change for adaptive IHOP
> sizing, that factors out the IHOP calculation from G1Collectorpolicy
> into separate classes?
>
> So instead of having this single line at G1CollectorPolicy:944
>
> 944 size_t marking_initiating_used_threshold =
> 945 (_g1->capacity() / 100) * InitiatingHeapOccupancyPercent;
> [...]
> 949 if ((cur_used_bytes + alloc_byte_size) >
> marking_initiating_used_threshold) {
>
> that determines whether marking should start, that decision is
> externalized into a G1IHOPControl class with a
> get_conc_mark_start_threshold() method.
>
> This allows flexible replacement of the IHOP calculation algorithm
> depending on some switch using a factory method.
>
> In addition to that, this change tracks and passes several information
> IHOPControl instances need, like allocation between gcs, mutator time
> from initial mark to the first mixed gc, and others.
>
> The change also adds some test.
>
> It depends on all my recent patches in this area, namely:
> 8140689: Skip last young-only gc if nothing to do in the mixed gc phase
> 8140597: Forcing an initial mark causes G1 to abort mixed collections
> 8140585: PLAB statistics are flushed too late
> 8139874: After G1 Full GC, the next GC is always a young-only GC
> 8138740: Start initial mark right after mixed GC if needed
>
> The problem is that it expects (and verifies) that the GC pauses are
> executed in the "correct" order.
>
> There is no behavioral change in this CR.
>
> CR:
> https://bugs.openjdk.java.net/browse/JDK-8136681
> Webrev:
> http://cr.openjdk.java.net/~tschatzl/8136681/webrev/
> Testing:
> jprt, vm.gc, lots of manual testing, new VM test
>
> Note that SQE will create additional tests.
>
> Thanks,
> Thomas
>
More information about the hotspot-gc-dev
mailing list