ConstantExpressionVisitor: decrease memory pressure

1. Use weak-referenced keys as it's unnecessary for cached constant values to live longer than any other reference (if PsiElement disappeared everywhere except constant expression cache, no reason to keep it in constant expression cache either)
2. Replace PsiClassReferenceType (as class literal value) as it keeps the strong reference to the surrounding PsiFile, so until the whole constant expression cache is invalidated (e.g. on PSI change) we don't free any file containing xyz.class expression.
This commit is contained in:
Tagir Valeev
2018-04-12 16:51:32 +07:00
parent 2a9bb2a0f6
commit e6749fcfe1
2 changed files with 11 additions and 3 deletions
@@ -16,16 +16,17 @@
package com.intellij.psi.impl;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.PsiClassReferenceType;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.ClassUtil;
import com.intellij.psi.util.ConstantEvaluationOverflowException;
import com.intellij.psi.util.ConstantExpressionUtil;
import java.util.HashMap;
import com.intellij.util.containers.StringInterner;
import gnu.trove.THashSet;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
@@ -507,7 +508,14 @@ class ConstantExpressionVisitor extends JavaElementVisitor implements PsiConstan
@Override
public void visitClassObjectAccessExpression(PsiClassObjectAccessExpression expression) {
myResult = expression.getOperand().getType();
PsiType type = expression.getOperand().getType();
if (type instanceof PsiClassReferenceType) {
PsiClass aClass = ((PsiClassReferenceType)type).resolve();
if (aClass != null) {
type = JavaPsiFacade.getElementFactory(expression.getProject()).createType(aClass, ((PsiClassReferenceType)type).getParameters());
}
}
myResult = type;
}
@Override public void visitReferenceExpression(PsiReferenceExpression expression) {
@@ -89,7 +89,7 @@ public class JavaConstantExpressionEvaluator extends JavaRecursiveElementWalking
}
private static final CachedValueProvider<ConcurrentMap<PsiElement,Object>> PROVIDER = () -> {
ConcurrentMap<PsiElement, Object> value = ContainerUtil.createConcurrentSoftMap();
ConcurrentMap<PsiElement, Object> value = ContainerUtil.createConcurrentWeakMap();
return CachedValueProvider.Result.create(value, PsiModificationTracker.MODIFICATION_COUNT);
};