On Thu, 19 Sep 2024 08:43:50 GMT, sli-x <d...@openjdk.org> wrote:

> The trigger of _codecache_GC_threshold in CodeCache::gc_on_allocation is the 
> key to this problem.
> 
> if (used_ratio > threshold) {
>     // After threshold is reached, scale it by free_ratio so that more 
> aggressive
>     // GC is triggered as we approach code cache exhaustion
>     threshold *= free_ratio;
>   }
>   // If code cache has been allocated without any GC at all, let's make sure
>   // it is eventually invoked to avoid trouble.
>   if (allocated_since_last_ratio > threshold) {
>     // In case the GC is concurrent, we make sure only one thread requests 
> the GC.
>     if (Atomic::cmpxchg(&_unloading_threshold_gc_requested, false, true) == 
> false) {
>       log_info(codecache)("Triggering threshold (%.3f%%) GC due to allocating 
> %.3f%% since last unloading (%.3f%% used -> %.3f%% used)",
>                           threshold * 100.0, allocated_since_last_ratio * 
> 100.0, last_used_ratio * 100.0, used_ratio * 100.0);
>       Universe::heap()->collect(GCCause::_codecache_GC_threshold);
>     }
>   }
> 
> Here with the limited codecache size, the free_ratio will get lower and lower 
> (so as the threshold) if no methods can be swept and thus leads to a more and 
> more frequent collection behavior. Since the collection happens in stw, the 
> whole performance of gc will also be degraded. 
> 
> So a simple solution is to delete the scaling logic here. However, I think 
> here lies some problems worth further exploring.
> 
> There're two options to control a code cache sweeper,  
> StartAggressiveSweepingAt and SweeperThreshold.  StartAggressiveSweepingAt is 
> a sweeper triggered for little space in codeCache and does little harm. 
> However,  SweeperThreshold, first introduced by 
> [JDK-8244660](https://bugs.openjdk.org/browse/JDK-8244660), was designed for 
> a regular sweep for codecache, when codeCache sweeper and heap collection are 
> actually individual. After 
> [JDK-8290025](https://bugs.openjdk.org/browse/JDK-8290025) and some patches 
> related, the old mechanism of codeCache sweeper is merged into a concurrent 
> heap collection. So the Code cache sweeper heuristics and the unloading 
> behavior will be promised by the concurrent collection. There's no longer any 
> "zombie" methods to be counted. Considering it will introduce lots of useless 
> collection jobs, I think SweeperThreshold should be deleted now.

Hi, 

please send an e-mail to dalibor.to...@oracle.com so that I can verify your 
account in Skara.

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

PR Comment: https://git.openjdk.org/jdk/pull/21084#issuecomment-2427338142

Reply via email to