RFR (M): JDK-8076314: Remove the static instance variable SharedHeap:: _sh
Bengt Rutisson
bengt.rutisson at oracle.com
Wed Apr 1 15:54:40 UTC 2015
One last update to this.
There were two assert in that I had to remove too. I had this in a patch
but missed it for the webrev. The complete webrev is now here:
http://cr.openjdk.java.net/~brutisso/8076314/webrev.02/
The diff compared to the last version is this change in thread.cpp:
@@ -752,17 +752,13 @@
jint res = Atomic::cmpxchg(strong_roots_parity, &_oops_do_parity,
thread_parity);
if (res == thread_parity) {
return true;
} else {
guarantee(res == strong_roots_parity, "Or else what?");
- assert(SharedHeap::heap()->workers()->active_workers() > 0,
- "Should only fail when parallel.");
return false;
}
}
- assert(SharedHeap::heap()->workers()->active_workers() > 0,
- "Should only fail when parallel.");
return false;
}
void Thread::oops_do(OopClosure* f, CLDClosure* cld_f,
CodeBlobClosure* cf) {
active_handles()->oops_do(f);
The asserts check that we are parallel, but the
Thread::claim_oops_do_par_case() method is only called when we are
parallel. Now that I have removed SharedHeap::heap() there is not good
way to keep these asserts.
Thanks,
Bengt
On 2015-04-01 17:36, Bengt Rutisson wrote:
>
> Thanks for the review, Per!
>
> Bengt
>
>
> On 2015-04-01 17:39, Per Liden wrote:
>> Hi,
>>
>> On 2015-04-01 17:08, Bengt Rutisson wrote:
>>>
>>> Hi Per,
>>>
>>> Thanks for looking at this!
>>>
>>> On 2015-04-01 14:03, Per Liden wrote:
>>>> Hi,
>>>>
>>>> On 2015-03-31 15:14, Bengt Rutisson wrote:
>>>>>
>>>>> Hi all,
>>>>>
>>>>> Could I have a couple of reviews for this change?
>>>>>
>>>>> http://cr.openjdk.java.net/~brutisso/8076314/webrev.00/
>>>>> https://bugs.openjdk.java.net/browse/JDK-8076314
>>>>>
>>>>> This is another step towards getting rid of SharedHeap. There used
>>>>> to be
>>>>> an instance variable in SharedHeap to keep track of the actual
>>>>> instance
>>>>> being used (which would be of type GenCollectedHeap or
>>>>> G1CollectedHeap).
>>>>>
>>>>> The SharedHeap::heap() would return this value and was mostly used in
>>>>> asserts.
>>>>>
>>>>> I've changed so that we use the specific instance in most cases.
>>>>> That is
>>>>> either GenCollectedHeap::heap() or G1CollectedHeap::heap().
>>>>>
>>>>> A couple of other changes were needed to avoid the use of
>>>>> SharedHeap::heap():
>>>>>
>>>>> - The field _thread_holds_heap_lock_for_gc was only used by G1
>>>>> and was
>>>>> thus moved to G1CollectedHeap. It brought with it the method
>>>>> heap_lock_held_for_gc() and I introduced
>>>>> set_heap_lock_held_for_gc() to
>>>>> set the value. All of these are only used in asserts so I put them
>>>>> in an
>>>>> #ifndef PRODUCT section. This also meant that I had to implement
>>>>> doit_prologue() and doit_epilogue() for
>>>>> VM_G1OperationWithAllocRequest
>>>>> to make sure that the state of _thread_holds_heap_lock_for_gc got set
>>>>> correctly.
>>>>>
>>>>> - The ageTable::compute_tenuring_threshold() method used the
>>>>> SharedHeap::heap() only to look up the perf counters for GC.
>>>>> Instead of
>>>>> having compute_tenuring_threshold() look that up I now pass in the
>>>>> correct counters from the callers.
>>>>>
>>>>> - The Threads::possibly_parallel_oops_do() method used the
>>>>> SharedHeap::heap() only to check if we were to execute in parallel. I
>>>>> moved the lookup of this to the callers and now just pass in an
>>>>> is_par
>>>>> paramter.
>>>>>
>>>>> - I simplified the VM_CGC_Operation::doit() a bit since even
>>>>> before my
>>>>> change the heap returned could never be NULL.
>>>>
>>>> Overall the change looks good, nice cleanup!
>>>>
>>>> One question, how about removing heap_lock_held_for_gc() and friends
>>>> completely? There's quite a bit of code added just for this single
>>>> assert() and I'm not sure the added noise is justified here. The path
>>>> already has an assert_heap_locked_or_at_safepoint() which it's exactly
>>>> the same thing, but I'm thinking it's enough.
>>>
>>> Yes, good point. I was thinking the same but didn't really dare to
>>> remove the assert. But I agree that the extra code is too much compared
>>> to the value of the assert. I removed it.
>>>
>>
>> Like!
>>
>>>>
>>>> A few other cosmetic comments:
>>>>
>>>> genCollectedHeap.cpp
>>>> --------------------
>>>> 609 bool is_par =n_par_threads() > 0;
>>>
>>> Fixed.
>>>
>>>>
>>>> A space missing there.
>>>>
>>>> g1CollectedHeap.cpp:
>>>> --------------------
>>>>
>>>> 2161 bool G1CollectedHeap::heap_lock_held_for_gc() {
>>>> 2162 Thread* t = Thread::current();
>>>> 2163 return Heap_lock->owned_by_self()
>>>> 2164 || ( (t->is_GC_task_thread() || t->is_VM_thread())
>>>> 2165 && _thread_holds_heap_lock_for_gc);
>>>> 2166 }
>>>>
>>>> A too many spaces here and there and lines are a bit misaligned.
>>>
>>> This code got removed. :)
>>>
>>> Updated webrev:
>>> http://cr.openjdk.java.net/~brutisso/8076314/webrev.01/
>>>
>>> Diff compared to last version:
>>> http://cr.openjdk.java.net/~brutisso/8076314/webrev.00-01.diff/
>>
>> Looks good Bengt!
>>
>> /Per
>
More information about the hotspot-gc-dev
mailing list