On Thu, 4 Feb 2021 20:45:55 GMT, djelinski 
<github.com+30433125+djelin...@openjdk.org> wrote:

> Thanks for your review! Some comments below.
> 
> > A full handshake or OCSP status grabbing could counteract all the 
> > performance gain with the cache update.
> 
> Yes, but that's unlikely. Note that K=3 is before K=1 in the queue only 
> because 3 wasn't used since 1 was last used. This means that either K=3 is 
> used less frequently than K=1, or that all cached items are in active use. In 
> the former case we don't lose much by dropping K=3 (granted, there's nothing 
> to offset that). In the latter we are dealing with full cache at all times, 
> which means that most `put()`s would scan the queue, and we will gain a lot 
> by finishing faster.

I may think it differently.  It may be hard to know the future frequency of an 
cached item based on the past behaviors.  For the above case, I'm not sure that 
K=3 is used less frequently than K=1.  Maybe, next few seconds, K=1 could be 
more frequently.

I would like a solution to following the timeout specification: keep the newer 
items if possible.

> 
> > get() [..] without [..] change the order of the queue
> 
> If we do that, frequently used entries will be evicted at the same age as 
> never used ones. This means we will have to recompute (full handshake/fresh 
> OCSP) both the frequently used and the infrequently used entries. It's better 
> to recompute only the infrequently used ones, and reuse the frequently used 
> as long as possible - we will do less work that way.
> That's probably the reason why a `LinkedHashMap` with `accessOrder=true` was 
> chosen as the backing store implementation originally.
> 

See above.  It may be true for some case to determine the frequency, but Cache 
is a general class and we may want to be more careful about if we are really be 
able to determine the frequency within the Cache implementation.

> > get() performance is more important [..] so we should try to keep the cache 
> > small if possible
> 
> I don't see the link; could you explain?
> 

link? Did you mean the link to get() method?  It is a method in the Cache class.

> > In the update, the SoftReference.clear() get removed. I'm not sure of the 
> > impact of the enqueued objects any longer. In theory, it could improve the 
> > memory use, which could counteract the performance gain in some situation.
> 
> That's the best part: no objects ever get enqueued! We only called `clear()` 
> right before losing the last reference to `SoftCacheEntry` (which is the 
> `SoftReference`). When GC collects the `SoftReference`, it does not enqueue 
> anything. GC only enqueues the `SoftReference` when it collects the 
> referenced object (session / OCSP response) without collecting the 
> `SoftReference` (cache entry) itself.
> This is [documented 
> behavior](https://docs.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html):
>  _If a registered reference becomes unreachable itself, then it will never be 
> enqueued._
> 

I need more time for this section.

> > Could you edit the bug
> 
> I'd need an account on the bug tracker first.

Okay.  No worries, I will help you if we could get an agreement about the 
update.

-------------

PR: https://git.openjdk.java.net/jdk/pull/2255

Reply via email to