Incorrect validation of DST in java.util.SimpleTimeZone
Venkateswara R Chintala
venkatec at linux.vnet.ibm.com
Tue Nov 21 09:14:33 UTC 2017
Thanks Peter for sponsoring this patch. Is there anything else that
needs to be done from my end for this patch to be integrated? Please let
me know.
-Venkat
On 14/11/17 8:46 PM, Peter Levart wrote:
> Hi Venkat,
>
> I created the following issue:
>
> https://bugs.openjdk.java.net/browse/JDK-8191216
>
> I can also sponsor this patch and push it for JDK 10.
>
> The patch that you are proposing looks good to me. Does anybody have
> anything else to say?
>
> Regards, Peter
>
>
> On 11/13/2017 11:28 AM, Venkateswara R Chintala wrote:
>> Thanks David, Peter for your review and comments. As I am new to the
>> community, can you please help me to open a bug and integrate the
>> changes into code base?
>>
>> -Venkat
>>
>> On 12/11/17 2:19 AM, Peter Levart wrote:
>>> Hi David, Venkat,
>>>
>>> On 11/11/17 21:15, Peter Levart wrote:
>>>> For example, take the following method:
>>>>
>>>> String defaultTZID() {
>>>> return TimeZone.getDefault().getID();
>>>> }
>>>>
>>>> When JIT compiles it and inlines invocations to other methods
>>>> within it, it can prove that cloned TimeZone instance never escapes
>>>> the call to defaultTZID() and can therefore skip allocating the
>>>> instance on heap.
>>>>
>>>> But this is fragile. If code in invoked methods changes, they may
>>>> not get inlined or EA may not be able to prove that the cloned
>>>> instance can't escape and allocation may be introduced.
>>>> ZoneId.systemDefault() is a hot method and it would be nice if we
>>>> manage to keep it allocation free.
>>>
>>> Well, I tried the following variant of SimpleTimeZone.clone() patch:
>>>
>>> public Object clone()
>>> {
>>> SimpleTimeZone tz = (SimpleTimeZone) super.clone();
>>> // like tz.invalidateCache() but without holding a lock on
>>> clone
>>> tz.cacheYear = tz.startYear - 1;
>>> tz.cacheStart = tz.cacheEnd = 0;
>>> return tz;
>>> }
>>>
>>>
>>> ...and the JMH benchmark with gc profiling shows that
>>> ZoneId.systemDefault() still manages to get JIT-compiled without
>>> introducing allocation.
>>>
>>> Even the following (original Venkat's) patch:
>>>
>>> public Object clone()
>>> {
>>> SimpleTimeZone tz = (SimpleTimeZone) super.clone();
>>> tz.invalidateCache();
>>> return tz;
>>> }
>>>
>>> ...does the same and the locking in invalidateCache() is elided too.
>>> Allocation and lock-elision go hand-in-hand. When object doesn't
>>> escape, allocation on heap may be eliminated and locks on that
>>> instance elided.
>>>
>>> So this is better than synchronizing on the original instance during
>>> .clone() execution as it has potential to avoid locking overhead.
>>>
>>> So Venkat, go ahead. My fear was unjustified.
>>>
>>> Regards, Peter
>>>
>>
>
>
--
Regards
-Venkat
More information about the core-libs-dev
mailing list