RFR: 8277981: String Deduplication table is never cleaned up due to bad dead_factor_for_cleanup

Kim Barrett kbarrett at openjdk.java.net
Tue Nov 30 15:11:14 UTC 2021


On Tue, 30 Nov 2021 12:30:11 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

> See the reproducer and analysis in the bug. 
> 
> The root cause for this problem is that `percent_of` returns `0..100` (percent) value of `nominator / denominator`. Which means if we feed `percent` and `100` there, this is an identity operation, returning the same value. And we wanted the conversion from percent to factor instead.
> 
> The default value for `StringDeduplicationCleanupDeadPercent` is `5`, which means (assuming `dead_count <= entry_count`) this erroneous conversion makes this condition always `false`:
> 
> 
> bool StringDedup::Config::should_cleanup_table(size_t entry_count, size_t dead_count) {
>   return (dead_count > _minimum_dead_for_cleanup) &&
>          (dead_count > (entry_count * _dead_factor_for_cleanup));
> }
> 
> 
> Additional testing:
>  - [x] Reproducer stress test does not leak anymore
>  - [x] Linux x86_64 fastdebug tier1, `-XX:+UseStringDeduplication`
>  - [x] Linux x86_64 fastdebug tier2, `-XX:+UseStringDeduplication`
>  - [x] Linux x86_64 fastdebug tier3, `-XX:+UseStringDeduplication`

Looks good.

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

Marked as reviewed by kbarrett (Reviewer).

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



More information about the hotspot-gc-dev mailing list