Thanks Jon.

I'm away at the moment but will give it a spin in the next few days and
let you know. Thanks again

On Mon, 16 Dec 2019, 22:53 Jonathan Gallimore, <jonathan.gallim...@gmail.com>
wrote:

> 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