Incorrect validation of DST in java.util.SimpleTimeZone

Venkateswara R Chintala venkatec at linux.vnet.ibm.com
Mon Nov 13 10:28:20 UTC 2017


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
>



More information about the core-libs-dev mailing list