Hi Paul

I've pushed a new snapshot which (hopefully) should address this. The CI
build is running on it now. Would you mind giving it a try? If it looks
good, I'll finish rolling the release. Fingers crossed it looks ok for you.

Jon

On Mon, Dec 16, 2019 at 2:48 PM Jonathan Gallimore <
jonathan.gallim...@gmail.com> wrote:

> Further update - I think my changes work with respect to this issue, but I
> do have a bunch of unit test failures which I need to look into. For info,
> here's the diff:
>
> diff --git
> a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> index a6e2bdc4f5..c0d1a8c98f 100644
> ---
> a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> +++
> b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> @@ -69,10 +69,7 @@ import org.apache.openejb.cdi.ThreadSingletonService;
>  import org.apache.openejb.classloader.ClassLoaderConfigurer;
>  import org.apache.openejb.classloader.CompositeClassLoaderConfigurer;
>  import org.apache.openejb.component.ClassLoaderEnricher;
> -import org.apache.openejb.config.ConfigurationFactory;
> -import org.apache.openejb.config.NewLoaderLogic;
> -import org.apache.openejb.config.QuickJarsTxtParser;
> -import org.apache.openejb.config.TldScanner;
> +import org.apache.openejb.config.*;
>  import org.apache.openejb.core.ConnectorReference;
>  import org.apache.openejb.core.CoreContainerSystem;
>  import org.apache.openejb.core.CoreUserTransaction;
> @@ -829,6 +826,14 @@ public class Assembler extends AssemblerTool
> implements org.apache.openejb.spi.A
>
>                  final AppContext appContext = new
> AppContext(appInfo.appId, SystemInstance.get(), classLoader,
> globalJndiContext, appJndiContext, appInfo.standaloneModule);
>                  appContext.getProperties().putAll(appInfo.properties);
> +
> +                final Set<Object> keys =
> appContext.getProperties().keySet();
> +                for (final Object key : keys) {
> +                    if (! Module.class.isInstance(key)) {
> +                        appContext.getProperties().remove(key);
> +                    }
> +                }
> +
>                  appContext.getInjections().addAll(injections);
>                  appContext.getBindings().putAll(globalBindings);
>                  appContext.getBindings().putAll(appBindings);
> diff --git
> a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
> b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
> index feff954d40..aed0fda941 100644
> ---
> a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
> +++
> b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
> @@ -384,12 +384,7 @@ public class JndiEncBuilder {
>                  reference = new LinkRef(jndiName);
>
>              } else if (BeanManager.class.equals(type)) {
> -                reference = new LazyObjectReference<BeanManager>(new
> Callable<BeanManager>() {
> -                    @Override
> -                    public BeanManager call() throws Exception {
> -                        return new
> InjectableBeanManager(WebBeansContext.currentInstance().getBeanManagerImpl());
> -                    }
> -                });
> +                reference = new LazyObjectReference<>(new
> BeanManagerLazyReference());
>
>              } else if (UserTransaction.class.equals(type)) {
>                  reference = new
> IntraVmJndiReference("comp/UserTransaction");
> @@ -684,4 +679,11 @@ public class JndiEncBuilder {
>              }
>          }
>      }
> +
> +    public static class BeanManagerLazyReference implements
> Callable<BeanManager> {
> +        @Override
> +        public BeanManager call() throws Exception {
> +            return new
> InjectableBeanManager(WebBeansContext.currentInstance().getBeanManagerImpl());
> +        }
> +    }
>  }
> diff --git
> a/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
> b/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
> index 2cf387e112..285007925f 100644
> ---
> a/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
> +++
> b/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
> @@ -59,6 +59,7 @@ public class TempClassLoader extends URLClassLoader {
>      private final ClassLoader system;
>      private final boolean embedded;
>      private final boolean parentURLClassLoader;
> +    private final StackTraceElement[] created;
>
>      // 80% of class files are smaller then 6k
>      private final ByteArrayOutputStream bout = new
> ByteArrayOutputStream(6 * 1024);
> @@ -69,6 +70,7 @@ public class TempClassLoader extends URLClassLoader {
>          this.system = ClassLoader.getSystemClassLoader();
>          this.embedded = this.getClass().getClassLoader() == this.system;
>          this.parentURLClassLoader =
> URLClassLoader.class.isInstance(parent);
> +        this.created = new Throwable().getStackTrace();
>      }
>
>      /*
>
> In essence, this does 2 things:
>
> 1. Defines the Callable for the LazyObjectReference for BeanManager as a
> static class. This stops that object from having a reference to
> JndiEncBuilder and everything that has attached to it.
> 2. Strips off the EjbModule / WebModule from the SuperProperties on
> AppContext. This is set when deploying through the apps folder and lives
> forever. It has the TempClassLoader attached, and therefore all the
> AnnotationFinder stuff.
>
> I suspect (2) is too aggressive and is causing the test failures, but will
> confirm.
>
> Jon
>
> On Mon, Dec 16, 2019 at 11:27 AM Jonathan Gallimore <
> jonathan.gallim...@gmail.com> wrote:
>
>> Thanks for sending those over. I'm digging through this - I *think* I
>> have pinned down a specific reference that stops that classloader from
>> being released. The behaviour for a war/ear deployed in apps/ seems
>> different to deploying in webapps/ - I'm assuming that's what you're doing.
>> If you can confirm, that would help. I'll test out a patch with some bigger
>> .ear files today.
>>
>> Thanks
>>
>> Jon
>>
>> On Thu, Dec 12, 2019 at 9:08 PM Jonathan Gallimore <
>> jonathan.gallim...@gmail.com> wrote:
>>
>>> The mailing list seems to be stripping off your images - can you resend
>>> and include my email address as well? I'd be keen to dig into this a little
>>> more.
>>>
>>> Thanks
>>>
>>> Jon
>>>
>>> On Thu, Dec 12, 2019 at 9:00 PM Paul Carter-Brown
>>> <paul.carter-br...@jini.guru> wrote:
>>>
>>>> Hi,
>>>>
>>>> The code does seem to use org.apache.openejb.core.TempClassLoader. I
>>>> can see one instance in the heap for every war in my ear. + 1.
>>>>
>>>> The TempClassLoader however still has 100's of strong references to it.
>>>> E.g:
>>>>
>>>> [image: image.png]
>>>>
>>>> [image: image.png]
>>>>
>>>>
>>>> Paul Carter-Brown
>>>> Director
>>>> Jini Guru
>>>> m: +27 (0) 83 442 7179 <+27834427179>
>>>> a: 1st Floor, Golf House, Design Quarter, Cnr. William Nicol and Leslie
>>>>   Johannesburg, South Africa
>>>> w: jini.guru  e: p...@jini.guru
>>>>
>>>> Disclaimer: This message and/or attachment(s) may contain
>>>> privileged, confidential and/or personal information. If you are not the
>>>> intended recipient you may not disclose or distribute any of
>>>> the information contained within this message. In such case you must
>>>> destroy this message and inform the sender of the error. Jini Guru may not
>>>> accept liability for any errors, omissions, information and viruses
>>>> contained in the transmission of this message. Any opinions, conclusions
>>>> and other information contained within this message not related to Jini
>>>> Guru official business is deemed to be that of the individual only and is
>>>> not endorsed by Jini Guru.
>>>>
>>>>
>>>>
>>>> On Thu, Dec 12, 2019 at 9:29 AM Mark Struberg <strub...@yahoo.de.invalid>
>>>> wrote:
>>>>
>>>>> Hi!
>>>>>
>>>>> All this is just a workaround imo.
>>>>>
>>>>> Afair we (Romain) introduced a temporary throw-away ClassLoader for
>>>>> scanning. That means after doing all the class scans we only keep the
>>>>> extracted information but do not keep the Classes in memory. Doesn't this
>>>>> work anymore?
>>>>>
>>>>> LieGrue,
>>>>> strub
>>>>>
>>>>>
>>>>> > Am 12.12.2019 um 00:45 schrieb Paul Carter-Brown
>>>>> <paul.carter-br...@jini.guru>:
>>>>> >
>>>>> > FYI. Graph of the change in heap size on a prod instance after this
>>>>> change:
>>>>> >
>>>>> >
>>>>> > Paul Carter-Brown
>>>>> > Director
>>>>> > Jini Guru
>>>>> > m:    +27 (0) 83 442 7179
>>>>> > a:    1st Floor, Golf House, Design Quarter, Cnr. William Nicol and
>>>>> Leslie
>>>>> >       Johannesburg, South Africa
>>>>> > w:    jini.guru  e: p...@jini.guru
>>>>> >
>>>>> > Disclaimer: This message and/or attachment(s) may contain
>>>>> privileged, confidential and/or personal information. If you are not the
>>>>> intended recipient you may not disclose or distribute any of the
>>>>> information contained within this message. In such case you must destroy
>>>>> this message and inform the sender of the error. Jini Guru may not accept
>>>>> liability for any errors, omissions, information and viruses contained in
>>>>> the transmission of this message. Any opinions, conclusions and other
>>>>> information contained within this message not related to Jini Guru 
>>>>> official
>>>>> business is deemed to be that of the individual only and is not endorsed 
>>>>> by
>>>>> Jini Guru.
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> > On Thu, Dec 12, 2019 at 1:17 AM Paul Carter-Brown
>>>>> <paul.carter-br...@jini.guru> wrote:
>>>>> > Hi Jon,
>>>>> >
>>>>> > I took a look at the source and worked out that I could add my own
>>>>> filters using openejb.additional.exclude.
>>>>> >
>>>>> > I set it to openejb.additional.exclude=com,net,io,org and the JVM
>>>>> heap now sits at around 150MB whereas it would never go below 450MB
>>>>> previously!!!
>>>>> >
>>>>> > Our EJB's and code is all in jars prefixed with guru.jini and hence
>>>>> they are not filtered out and the system works 100%.
>>>>> >
>>>>> > My sense is that there should be an easier way to specify what jars
>>>>> and/or packages to process for annotations. I have come across the
>>>>> following settings but can't really work out what fits where:
>>>>> >
>>>>> > openejb.additional.exclude
>>>>> > openejb.additional.include
>>>>> > openejb.deployments.classpath.filter.descriptors
>>>>> > openejb.deployments.classpath.filter.systemapps
>>>>> > openejb.deployments.classpath.include
>>>>> > openejb.deployments.classpath.exclude
>>>>> > openejb.deployments.package.include
>>>>> > openejb.deployments.package.exclude
>>>>> >
>>>>> >
>>>>> > P.S. Perhaps also add these to the standard exclusion list as they
>>>>> are common and yet won't need to be processed for annotations I guess?
>>>>> > com.amazonaws
>>>>> > com.fasterxml
>>>>> > com.google
>>>>> > com.hazelcast
>>>>> > io.grpc
>>>>> > io.netty
>>>>> > org.docx4j
>>>>> > org.mongodb
>>>>> > org.rocksdb
>>>>> > org.asynchttpclient
>>>>> > org.apache
>>>>> > org.aspectj
>>>>> >
>>>>> > But then maybe some are too broad and I don't really understand what
>>>>> the annotation index/cache is really needed for at runtime? Can it not be
>>>>> lazy loaded or discarded if unused? Just thinking out loud here :-( Seems
>>>>> like the cache uses a significant amount of heap when considering the 
>>>>> drive
>>>>> towards tiny micro services.
>>>>> >
>>>>> > Paul Carter-Brown
>>>>> > Director
>>>>> > Jini Guru
>>>>> > m:    +27 (0) 83 442 7179
>>>>> > a:    1st Floor, Golf House, Design Quarter, Cnr. William Nicol and
>>>>> Leslie
>>>>> >       Johannesburg, South Africa
>>>>> > w:    jini.guru  e: p...@jini.guru
>>>>> >
>>>>> > Disclaimer: This message and/or attachment(s) may contain
>>>>> privileged, confidential and/or personal information. If you are not the
>>>>> intended recipient you may not disclose or distribute any of the
>>>>> information contained within this message. In such case you must destroy
>>>>> this message and inform the sender of the error. Jini Guru may not accept
>>>>> liability for any errors, omissions, information and viruses contained in
>>>>> the transmission of this message. Any opinions, conclusions and other
>>>>> information contained within this message not related to Jini Guru 
>>>>> official
>>>>> business is deemed to be that of the individual only and is not endorsed 
>>>>> by
>>>>> Jini Guru.
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> > On Wed, Dec 11, 2019 at 7:18 PM Paul Carter-Brown
>>>>> <paul.carter-br...@jini.guru> wrote:
>>>>> > Hi Jon,
>>>>> >
>>>>> > Unfortunately the snapshot behaves exactly the same way
>>>>> >
>>>>> > Paul Carter-Brown
>>>>> > Director
>>>>> > Jini Guru
>>>>> > m:    +27 (0) 83 442 7179
>>>>> > a:    1st Floor, Golf House, Design Quarter, Cnr. William Nicol and
>>>>> Leslie
>>>>> >       Johannesburg, South Africa
>>>>> > w:    jini.guru  e: p...@jini.guru
>>>>> >
>>>>> > Disclaimer: This message and/or attachment(s) may contain
>>>>> privileged, confidential and/or personal information. If you are not the
>>>>> intended recipient you may not disclose or distribute any of the
>>>>> information contained within this message. In such case you must destroy
>>>>> this message and inform the sender of the error. Jini Guru may not accept
>>>>> liability for any errors, omissions, information and viruses contained in
>>>>> the transmission of this message. Any opinions, conclusions and other
>>>>> information contained within this message not related to Jini Guru 
>>>>> official
>>>>> business is deemed to be that of the individual only and is not endorsed 
>>>>> by
>>>>> Jini Guru.
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> > On Wed, Dec 11, 2019 at 3:39 PM Jonathan Gallimore <
>>>>> jonathan.gallim...@gmail.com> wrote:
>>>>> > Hi Paul
>>>>> >
>>>>> > Would you mind trying your application with a recent snapshot?
>>>>> >
>>>>> https://repository.apache.org/content/repositories/snapshots/org/apache/tomee/apache-tomee/8.0.1-SNAPSHOT/
>>>>> .
>>>>> > I recently updated the exclude list.
>>>>> >
>>>>> > Many thanks
>>>>> >
>>>>> > Jon
>>>>> >
>>>>> > On Wed, Dec 11, 2019 at 12:31 PM Paul Carter-Brown
>>>>> > <paul.carter-br...@jini.guru> wrote:
>>>>> >
>>>>> > > Hi,
>>>>> > >
>>>>> > > I've been trying to lower the memory footprint of an EAR deployed
>>>>> to TomEE
>>>>> > > 8.0.0.
>>>>> > >
>>>>> > > Here is a screenshot of the heap histogram. The total Old Gen is
>>>>> about
>>>>> > > 450MB (after forcing multiple GC's). If I boot TomEE without my
>>>>> EAR then
>>>>> > > the old gen is about 6MB.
>>>>> > >
>>>>> > > [image: Screenshot from 2019-12-11 12-53-12.png]
>>>>> > >
>>>>> > > The entire ear is 140MB zip, most of which is in the ears /lib
>>>>> directory
>>>>> > > which contains libs such as Kafka, hazelcast, apache POI, Google
>>>>> cloud
>>>>> > > APIs, AWS client APIs etc etc. In total our code has about 100
>>>>> actual
>>>>> > > EJB's. If i remove files from the lib folder in the ear then I can
>>>>> see that
>>>>> > > the memory used by the annotation finder is lowered.
>>>>> > >
>>>>> > > Is there any way I can tell TomEE that it need not bother scanning
>>>>> > > everything in the /lib folder of my EAR for annotations and
>>>>> fulling up the
>>>>> > > heap. I already
>>>>> > > set openejb.deployments.classpath.include=.*jg-arch-core-impl.* to
>>>>> scan
>>>>> > > only the one jar in /lib which does have EJB's in it and it seems
>>>>> to obey
>>>>> > > this property but it doesn't seem to mean that annotation
>>>>> processing is
>>>>> > > skipped for all these other jars in /lib
>>>>> > >
>>>>> > > Thanks!
>>>>> > >
>>>>> > > Paul Carter-Brown
>>>>> > > Director
>>>>> > > Jini Guru
>>>>> > > m: +27 (0) 83 442 7179 <+27834427179>
>>>>> > > a: 1st Floor, Golf House, Design Quarter, Cnr. William Nicol and
>>>>> Leslie
>>>>> > >   Johannesburg, South Africa
>>>>> > > w: jini.guru  e: p...@jini.guru
>>>>> > >
>>>>> > > Disclaimer: This message and/or attachment(s) may contain
>>>>> > > privileged, confidential and/or personal information. If you are
>>>>> not the
>>>>> > > intended recipient you may not disclose or distribute any of
>>>>> > > the information contained within this message. In such case you
>>>>> must
>>>>> > > destroy this message and inform the sender of the error. Jini Guru
>>>>> may not
>>>>> > > accept liability for any errors, omissions, information and viruses
>>>>> > > contained in the transmission of this message. Any opinions,
>>>>> conclusions
>>>>> > > and other information contained within this message not related to
>>>>> Jini
>>>>> > > Guru official business is deemed to be that of the individual only
>>>>> and is
>>>>> > > not endorsed by Jini Guru.
>>>>> > >
>>>>> > >
>>>>>
>>>>>

Reply via email to