From e6749fcfe11141d6499a5820e39211b21d6ad070 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 12 Apr 2018 16:27:00 +0700 Subject: [PATCH] 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. --- .../intellij/psi/impl/ConstantExpressionVisitor.java | 12 ++++++++++-- .../psi/impl/JavaConstantExpressionEvaluator.java | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/ConstantExpressionVisitor.java b/java/java-psi-impl/src/com/intellij/psi/impl/ConstantExpressionVisitor.java index 4e2a1ebfdbbd..0c53e114b46d 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/ConstantExpressionVisitor.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/ConstantExpressionVisitor.java @@ -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) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java index dea9c8b1fc43..a8c083d6ead7 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java @@ -89,7 +89,7 @@ public class JavaConstantExpressionEvaluator extends JavaRecursiveElementWalking } private static final CachedValueProvider> PROVIDER = () -> { - ConcurrentMap value = ContainerUtil.createConcurrentSoftMap(); + ConcurrentMap value = ContainerUtil.createConcurrentWeakMap(); return CachedValueProvider.Result.create(value, PsiModificationTracker.MODIFICATION_COUNT); };