RFR (M): 8136681: Factor out IHOP calculation from G1CollectorPolicy
Erik Helin
erik.helin at oracle.com
Fri Nov 20 16:26:47 UTC 2015
On 2015-11-16, Thomas Schatzl wrote:
> Hi Jon,
>
> thanks a lot for all these reminders for better documentation. I have
> been working too long on this functionality so that "everything is
> clear" to me :)
>
> New webrevs with hopefully more complete explanations at:
> http://cr.openjdk.java.net/~tschatzl/8136681/webrev.1_to_2/
> (incremental)
> http://cr.openjdk.java.net/~tschatzl/8136681/webrev.2/ (changes)
Hi Thomas,
here comes a small partial review:
g1IHOPControl.cpp:
109 #endif
110
111 #ifndef PRODUCT
- Please continue using the existing #ifndef
82 size_t threshold;
83
84 threshold = ctrl.get_conc_mark_start_threshold();
- Please initialize the variable when you declare it
Other:
- Maybe rename _last_allocated_old_bytes to
_bytes_allocated_in_old_since_last_gc?
Thanks,
Erik
>
> On Fri, 2015-11-13 at 07:58 -0800, Jon Masamitsu wrote:
> >Thomas,
> >
> > 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".
>
> Fixed.
>
> > 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.
>
> I tried to explain in in the text. In short, in G1 the IHOP value is
> based on old gen occupancy only. The problem is that the young gen also
> needs to be allocated somewhere too.
>
> Now you could just say, use the maximum young gen size. However this is
> 60% of the heap by default... so the adaptive IHOP algorithm uses a
> measure of the young gen that is not bounded by G1ReservePercent.
>
> The reason to use the unbounded value is because if the code used the
> bounded one, it would cancel out with G1ReservePercent, because the
> closer we get to G1ReservePercent, the smaller that bounded value would
> get, which would make the current IHOP value rise etc, which would delay
> the initiation of the marking.
>
> That would end up loosing throughput as then the young gen gets smaller
> and smaller (and GC frequency increases), it can take a long time until
> G1 gets close enough to G1ReservePercent so that the other factors
> (allocation rate, marking time) are used.
>
> Basically initial mark will be delayed until young gen reaches its
> minimum size, at which time G1 will continue to use that young gen size
> until marking occurs. Which means that typically G1 will eat into
> G1ReservePercent, which we also do not want.
>
> Additionally it would get G1 more in trouble in regards to pause time,
> giving it less room during that time.
>
> Note that G1 young gen sizing already has some issues with young gen
> sizing if it operates close to G1ReservePercent. If there is time I will
> look at it again later.
>
> > 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.
>
> I skipped that paragraph about which waste e.g. at end of TLABs or
> humongous regions is used, and which not. IHOP calculation needs to
> consider actual free space for allocation.
>
> Unfortunately G1 is in two minds about this, i.e. used() for humongous
> objects does not contain the "waste" at the end of the las region, but
> used() for regular regions does.
>
> >
> > 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.
> >
>
> Done.
>
> Thanks a lot for all these reminders for documentation. I have been
> working too long on this functionality so that "everything is clear" to
> me :)
>
> New webrevs with hopefully more complete explanations at:
> http://cr.openjdk.java.net/~tschatzl/8136681/webrev.1_to_2/
> (incremental)
> http://cr.openjdk.java.net/~tschatzl/8136681/webrev.2/ (changes)
>
> > // 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.
>
> I already thought a little about how this should interact with regards
> to the calculation: the idea is that basically the algorithm will notice
> that there is a significant amount of additional allocation, and will
> lower the IHOP threshold automatically. (Looking through the code I
> think I saw some problems here, I will see to fix that)
>
> If evacuation failure happens in a gc during marking, there are a few
> options, I have not decided on what's best:
>
> - do nothing because the user asked to run an impossible to manage
> workload (combination of live set, allocation rate, and other options).
>
> - there is already some log output which that information can be
> derived from.
>
> - allow the user to set a maximum IHOP threshold. He could base this
> value on the log messages he gets.
> - the user can already do that by increasing G1ReservePercent btw
>
> - make sure that marking completes in time
>
> - let the mutator threads (or during young gcs while marking is
> running) do some marking if we notice that we do not have enough time.
> Not sure if it is worth the effort.
>
> - fix some bugs in marking :) that prevent that in extraordinary
> conditions.
>
> - make sure that we always start marking early enough by making sure
> that mixed gc reclaims enough memory. Planning some work here as part of
> generic work on improving gc policy.
>
> - improve predictions: some work being done here.
>
> - make evacuation failure really fast and hope it works out
>
> - do not immediately move young gen regions with evacuation failures
> into young gen regions, but make them survivor.
>
> - there have already been lots of improvements here as you might have
> noticed.
>
> Thanks,
> Thomas
>
>
More information about the hotspot-gc-dev
mailing list