RFR: 6543126: Level.known can leak memory
Peter Levart
peter.levart at gmail.com
Wed Aug 10 21:06:17 UTC 2016
Hi Daniel,
This is not strictly necessary, but here are a couple of things you
might consider doing while changing this code:
Using new JDK 8 Map API, the following could be simplified:
580 static synchronized void add(Level l) {
581 purge();
582 // the mirroredLevel object is always added to the list
583 // before the custom Level instance
584 KnownLevel o = new KnownLevel(l);
585 List<KnownLevel> list = nameToLevels.get(l.name);
586 if (list == null) {
587 list = new ArrayList<>();
588 nameToLevels.put(l.name, list);
589 }
590 list.add(o);
591
592 list = intToLevels.get(l.value);
593 if (list == null) {
594 list = new ArrayList<>();
595 intToLevels.put(l.value, list);
596 }
597 list.add(o);
598 }
into...
static synchronized void add(Level l) {
purge();
KnownLevel o = new KnownLevel(l);
nameToLevels.computeIfAbsent(l.name, n -> new ArrayList<>()).add(o);
intToLevels.computeIfAbsent(l.value, v -> new ArrayList<>()).add(o);
}
Removing a KnownLevel could also remove ArrayList(s) when they become empty:
561 private void remove() {
562
Optional.ofNullable(nameToLevels.get(mirroredLevel.name)).ifPresent((x)
-> x.remove(this));
563
Optional.ofNullable(intToLevels.get(mirroredLevel.value)).ifPresent((x)
-> x.remove(this));
564 }
...
private void remove() {
nameToLevels.computeIfPresent(mirroredLevel.name, (n, l) ->
l.remove(this) && l.isEmpty() ? null : l);
intToLevels.computeIfPresent(mirroredLevel.value, (v, l) ->
l.remove(this) && l.isEmpty() ? null : l);
}
Regards, Peter
And if you implement Mandy's suggestion to return Optional<Level>
On 08/10/2016 06:21 PM, Mandy Chung wrote:
>> On Jul 29, 2016, at 4:54 AM, Daniel Fuchs <daniel.fuchs at oracle.com> wrote:
>>
>> http://cr.openjdk.java.net/~dfuchs/webrev_6543126/webrev.01/
> This looks pretty good.
>
> Since KnownLevel is now a Reference, I suggest to change KnownLevel::findByName, findByValue and findByLocalizedLevelName to return Optional<Level> instead such that the parse method implementaiton could be simplified.
>
> Mandy
More information about the core-libs-dev
mailing list