I don’t have an account in the bug tracking system. Could someone possibly 
update the issue noted below to indicate that Apache Log4j 2 would also like 
that enhancement?

Thanks,

Ralph

> On Apr 5, 2021, at 1:26 PM, Roger Riggs <roger.ri...@oracle.com> wrote:
> 
> Hi,
> 
> Java does not have a data type with enough resolution to hold a full 
> nanosecond value.
> Hence the implementation of Instant holding seconds and nanos.
> 
> There is an long dormant enhancement request to return micro-seconds as a 
> long.
> 8196003 <https://bugs.openjdk.java.net/browse/JDK-8196003> java.time Instant 
> and Duration methods for microseconds
> 
> That might be useful if the application gets enough resolution from 
> microseconds.
> There might be some clever interpolation between System.currentTimeMillis()
> and adjusting with System.nanoTime().
> Though it would likely not be exactly synchronized with the values from 
> Instant.
> 
> Regards, Roger
> 
> 
> On 4/5/21 3:56 PM, Brian Goetz wrote:
>> Project Valhalla will allow Instant to be migrated to a primitive class, 
>> which would address your problem.
>> 
>> On 4/2/2021 7:47 PM, Ralph Goers wrote:
>>> Log4j 2 supports the notion of a PreciseClock - one that can be initialized 
>>> to something more precise than a millisecond. At the same time it also 
>>> supports running with no heap allocations in certain circumstances. I am in 
>>> the process of moving our master branch to require Java 11 as the minimum. 
>>> In doing so I am encountering unit test errors while verifying that logging 
>>> is garbage free. They all occur allocating an Instant.
>>> 
>>> The code we have simply does
>>> 
>>> public void init(MutableInstant mutableInstant) {
>>>      Instant instant = java.time.Clock.systemUTC().instant();
>>> mutableInstant.initFromEpochSecond(instant.getEpochSecond(), 
>>> instant.getNano());
>>> }
>>> In our previous tests we had thought the allocation was being eliminated 
>>> due to escape analysis since the data is being extracted from the Instant 
>>> and not passed along. However, after upgrading the Google test library and 
>>> the JDK version it appears that is not the case.
>>> Ideally we would really like something like
>>> 
>>> public void init(MutableInstant mutableInstant) {
>>>         java.time.Clock.systemUTC().initInstant(mutableInstant);
>>> }
>>> 
>>> where Mutable instant would implement an interface that has the two set 
>>> methods.The method would execute the same logic that is in the instant() 
>>> method but instead of creating a new Instant it would call the set methods 
>>> for the provided object.
>>> 
>>> This would allow us to either have the MutableInstants in ThreadLocals or 
>>> some other mechanism to ensure they are thread safe and have no heap 
>>> allocations. As it stands now I see no way to gain access to the higher 
>>> precision clock without memory allocation.
>>> 
>>> Do you know of another way to do this? Am I missing something?
>>> 
>>> Ralph
>> 
> 
> 


Reply via email to