We do not leak if the ApplicationBoundary is setup correctly. And nowadays one almost always restarts the full container, not a single webapp anyway.
I dig the compile time part. LieGrue, strub > Am 01.03.2020 um 14:25 schrieb Romain Manni-Bucau <rmannibu...@gmail.com>: > > Le dim. 1 mars 2020 à 13:36, Mark Struberg <strub...@yahoo.de.invalid> a > écrit : > >>>> Am I missing something? >> >> Yes, the problem is imo the name. >> What we might try is to have a long string where we concatenate all >> criterias together, and then do a md5 over it. >> That means there is a low chance of clashes but a high chance of the being >> able to re-create the same class name. >> Although once we hit the field of CDI Extension modifications it is not >> 100% anymore. >> > > We can also do it like weld: a generic proxy for everything so single proxy > per class per classloader. Would be a bit less optimized but would be > better if you start/stop containers in the same classloader, today we leak > until you configure the class unloading. > > >> That was the reason why we bound the generated procy classes to their >> beans. What's wrong with this approach? >> Why don't you like that? >> > > I didnt say I dont like that, I said it doesnt work some times. > Point is we must today enable a new use case: build time proxy generation > (2-3 sub use cases: 1. Graalvm/aot, 2. optimized startup/cloud (we already > have optims for other area) and 3. better support of future jvm where > unsafe can be broken before we fix its replacement (intermediate built time > replacement of defineClass by generating proxies). > > High level, it is about scanning at build time somehow (can even be > explicit class or beans listing but i expect a mvn plugin hooked through > our metadata discovery), generate all proxy .class and be able to load them > by name instead of generate them. > A trivial option can be to have a mapping file, bean#id -> proxyname maybe? > > A spi plugged into abstractproxyfactory is fine but having something built > in sounds better since it is not really about changing the behavior but > more being ~reentrant. > > Hope it is clearer. > > > >> LieGrue, >> strub >> >>> Am 01.03.2020 um 08:16 schrieb Romain Manni-Bucau <rmannibu...@gmail.com >>> : >>> >>> Up, I'd like to get it - worse case with a spi - for next release to at >>> least enable to become native even if not yet trivial. >>> >>> Romain Manni-Bucau >>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>> <https://rmannibucau.metawerx.net/> | Old Blog >>> <http://rmannibucau.wordpress.com> | Github < >> https://github.com/rmannibucau> | >>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book >>> < >> https://www.packtpub.com/application-development/java-ee-8-high-performance >>> >>> >>> >>> Le lun. 11 nov. 2019 à 20:40, Romain Manni-Bucau <rmannibu...@gmail.com> >> a >>> écrit : >>> >>>> @Mark: so it means my proposal work, right? ;). Joke apart my proposal >> was >>>> not to have 1 proxy per type but 1 stable name per proxy without >> changing >>>> the number of classes and reuse the existing one if it already exists in >>>> the classloader. >>>> The only part which can fail is this last one since you can start twice >> a >>>> container in the same classloader and change the meta so the proxy but >>>> since the proxy contains the intercepted method markers in its name the >>>> reuse is safe. >>>> >>>> So I think it is ok even if the naming convention can likely be refined >> a >>>> lot, no? Am I missing something? >>>> >>>> Romain Manni-Bucau >>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>> <http://rmannibucau.wordpress.com> | Github >>>> <https://github.com/rmannibucau> | LinkedIn >>>> <https://www.linkedin.com/in/rmannibucau> | Book >>>> < >> https://www.packtpub.com/application-development/java-ee-8-high-performance >>> >>>> >>>> >>>> Le lun. 11 nov. 2019 à 20:28, Mark Struberg <strub...@yahoo.de.invalid> >> a >>>> écrit : >>>> >>>>> Sure! >>>>> >>>>> Think about having an interface and 3 producer methods. Each with >>>>> different proxy configuration. Means 3 different bytecode >> optimisations for >>>>> the same class. >>>>> Or having an interface in an EAR and 4 WARs which have their own impls. >>>>> Still the proxy gets generated and loaded via the shared >> EarClassLoader for >>>>> class visibility reasons. >>>>> >>>>> So there are scenarios where you end up with n proxies - each with >>>>> different bytecode - for the same class. >>>>> >>>>> LieGrue, >>>>> strub >>>>> >>>>>> Am 11.11.2019 um 20:16 schrieb Romain Manni-Bucau < >>>>> rmannibu...@gmail.com>: >>>>>> >>>>>> @Mark: not sure what you mean and which case you have in mind. Can you >>>>>> precise your answer please and what prevents my patch to work? >>>>>> >>>>>> Le lun. 11 nov. 2019 à 20:13, Mark Struberg <strub...@yahoo.de.invalid >>> >>>>> a >>>>>> écrit : >>>>>> >>>>>>> no we still need it imo >>>>>>> >>>>>>>> Am 09.11.2019 um 16:30 schrieb Romain Manni-Bucau < >>>>> rmannibu...@gmail.com >>>>>>>> : >>>>>>>> >>>>>>>> Hi everyone, >>>>>>>> >>>>>>>> I wonder if we can drop the loop >>>>>>>> in >>>>> org.apache.webbeans.proxy.AbstractProxyFactory#getUnusedProxyClassName >>>>>>>> to ensure we have stable names for proxies. >>>>>>>> The rational behind that is to: >>>>>>>> >>>>>>>> 1. Stop creating the same class again and again when we >>>>>>>> start/stop/restart/restop/... a container in the same classloader >>>>>>>> 2. Ensure we have deterministic names for the same proxy (currently, >>>>> when >>>>>>>> the name are conflicting, it depends what was executed before, even >> in >>>>>>> the >>>>>>>> same app!). >>>>>>>> >>>>>>>> From a quick review we only need to mark the intercepted methods in >>>>> the >>>>>>>> proxy name to ensure we can reuse the existing class. Therefore a >>>>> quick >>>>>>>> proposal for the proxy name suffix is: >>>>>>>> >>>>>>>> + protected String getProxySuffix(final Method[] >>>>> interceptedMethods, >>>>>>>> + final Method[] >>>>>>> nonInterceptedMethods) { >>>>>>>> + return "__i_" + getMethodsId(interceptedMethods); >>>>>>>> + } >>>>>>>> + >>>>>>>> + private String getMethodsId(final Method[] methods, final >>>>>>>> Predicate<Method> filter) { >>>>>>>> + return Stream.of(methods) >>>>>>>> + .filter(filter) >>>>>>>> + .map(m -> m.getName() + >>>>>>>> + >>>>>>>> >>>>>>> >>>>> >> Stream.of(m.getParameterTypes()).map(Class::getSimpleName).collect(joining())) >>>>>>>> + .collect(joining("_")); >>>>>>>> + } >>>>>>>> >>>>>>>> Full patch is available here: >>>>>>>> >> https://gist.github.com/rmannibucau/6f6cdf8d605387ac8820dcbc76e67909 >>>>>>>> >>>>>>>> Wdyt? >>>>>>>> >>>>>>>> If not desired, should I >>>>>>>> enrich org.apache.webbeans.spi.DefiningClassService with that >> feature? >>>>>>>> >>>>>>>> >>>>>>>> Romain Manni-Bucau >>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>>>>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>>>>>> <http://rmannibucau.wordpress.com> | Github < >>>>>>> https://github.com/rmannibucau> | >>>>>>>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book >>>>>>>> < >>>>>>> >>>>> >> https://www.packtpub.com/application-development/java-ee-8-high-performance >>>>>>>> >>>>>>> >>>>>>> >>>>> >>>>> >> >>