Skip to content

Commit

Permalink
FISH-5723 Fixes WebappClassloader memory-leak issue by removing JAXRS…
Browse files Browse the repository at this point in the history
…Resources classes from cache on shutdown event (#5102)

* FISH-5723 Fixes WebappClassloader memory-leak issue by removing JAXRS Resources classes from cache on shutdown event

Signed-off-by: Gaurav Gupta <[email protected]>
  • Loading branch information
jGauravGupta authored Aug 1, 2022
1 parent db814c9 commit 66ee890
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2022 Payara Foundation and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand All @@ -16,6 +17,7 @@

package org.glassfish.jersey.internal.util.collection;

import java.util.Enumeration;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
Expand Down Expand Up @@ -107,6 +109,15 @@ public void clear() {
cache.clear();
}

/**
* Get the cache keys
*
* @return
*/
public Enumeration<K> keys() {
return cache.keys();
}

/**
* Returns true if the key has already been cached.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2018 Payara Foundation and/or its affiliates. All rights reserved.
* Copyright (c) 2018, 2022 Payara Foundation and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand Down Expand Up @@ -66,6 +66,7 @@
import jakarta.enterprise.inject.spi.Bean;
import jakarta.enterprise.inject.spi.BeanManager;
import jakarta.enterprise.inject.spi.BeforeBeanDiscovery;
import jakarta.enterprise.inject.spi.BeforeShutdown;
import jakarta.enterprise.inject.spi.Extension;
import jakarta.enterprise.inject.spi.InjectionPoint;
import jakarta.enterprise.inject.spi.InjectionTarget;
Expand Down Expand Up @@ -960,6 +961,11 @@ private void beforeBeanDiscovery(@Observes final BeforeBeanDiscovery beforeBeanD
);
}

@SuppressWarnings("unused")
private void beforeShutDown(@Observes final BeforeShutdown beforeShutdown, final BeanManager beanManager) {
runtimeSpecifics.clearJaxRsResource(Thread.currentThread().getContextClassLoader());
}

/**
* Add a predicate to test HK2 dependency to create a CDI bridge bean to HK2 for it.
* @param predicate to test whether given class is a HK2 dependency.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2022 Payara Foundation and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand All @@ -20,6 +21,7 @@
import jakarta.enterprise.inject.spi.AnnotatedType;
import jakarta.ws.rs.core.Context;
import java.lang.annotation.Annotation;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;

Expand Down Expand Up @@ -59,4 +61,9 @@ public boolean isAcceptableResource(Class<?> resource) {
public boolean isJaxRsResource(Class<?> resource) {
return false;
}

@Override
public void clearJaxRsResource(ClassLoader loader) {
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2022 Payara Foundation and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand Down Expand Up @@ -34,4 +35,6 @@ interface CdiComponentProviderRuntimeSpecifics {
boolean isAcceptableResource(Class<?> resource);

boolean isJaxRsResource(Class<?> resource);

void clearJaxRsResource(ClassLoader loader);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2022 Payara Foundation and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand Down Expand Up @@ -48,6 +49,7 @@
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.util.Enumeration;

/**
* Server side runtime CDI ComponentProvider specific implementation.
Expand Down Expand Up @@ -225,6 +227,17 @@ public boolean isJaxRsResource(Class<?> resource) {
return jaxRsResourceCache.apply(resource);
}

@Override
public void clearJaxRsResource(ClassLoader loader) {
Enumeration<Class<?>> keys = jaxRsResourceCache.keys();
while (keys.hasMoreElements()) {
Class<?> key = keys.nextElement();
if (key.getClassLoader() == loader) {
jaxRsResourceCache.remove(key);
}
}
}

@Override
public boolean containsJaxRsParameterizedCtor(final AnnotatedType annotatedType) {
return CdiComponentProvider
Expand Down

0 comments on commit 66ee890

Please sign in to comment.