> This fix introduces immutable sets of `PseudoClass` almost everywhere, as > they are rarely modified. These are re-used by caching them in a new class > `ImmutablePseudoClassSetsCache`. > > In order to make this work, `BitSet` had to be cleaned up. It made > assumptions about the collections it is given (which may no longer always be > another `BitSet`). I also added the appropriate null checks to ensure there > weren't any other bugs lurking. > > Then there was a severe bug in `toArray` in both the subclasses that > implement `BitSet`. > > The bug in `toArray` was incorrect use of the variable `index` which was used > for both advancing the pointer in the array to be generated, as well as for > the index to the correct `long` in the `BitSet`. This must have resulted in > other hard to reproduce problems when dealing with `Set<PseudoClass>` or > `Set<StyleClass>` if directly or indirectly calling `toArray` (which is for > example used by `List.of` and `Set.of`). > > The net result of this change is that there are far fewer `PseudoClassState` > objects created; the majority of these are never modified, and the few that > are left are where you'd expect to see them modified. > > A test with 160 nested HBoxes which were given the hover state shows a 99.99% > reduction in `PseudoClassState` instances and a 70% reduction in heap use > (220 MB -> 68 MB), see the linked ticket for more details. > > Although the test case above was extreme, this change should have positive > effects for most applications.
John Hendrikx has updated the pull request incrementally with one additional commit since the last revision: Simplify ImmutablePseudoClassSetsCache and avoid an unnecessary copy ------------- Changes: - all: https://git.openjdk.org/jfx/pull/1076/files - new: https://git.openjdk.org/jfx/pull/1076/files/87e6f63e..e9300e9f Webrevs: - full: https://webrevs.openjdk.org/?repo=jfx&pr=1076&range=01 - incr: https://webrevs.openjdk.org/?repo=jfx&pr=1076&range=00-01 Stats: 18 lines in 1 file changed: 2 ins; 12 del; 4 mod Patch: https://git.openjdk.org/jfx/pull/1076.diff Fetch: git fetch https://git.openjdk.org/jfx.git pull/1076/head:pull/1076 PR: https://git.openjdk.org/jfx/pull/1076