Thanks for writing this Johann! To add to the story; I've been doing WO for almost 20 years and until recently I almost never used WODynamicElement. I just never needed to — and now I'm somewhat embarrassed about it.
A couple of months ago I was digging into WO and decided it was time I tried writing Dynamic Elements. I had a couple of small components (the type that's really just a wrapper for a WOString showing a rendered value, like a date or a number) and I decided to test changing them from WOComponents to WODynamicElements. Since they were being used in reporting type applications (with lots of instances created) I got pretty dramatic immediate performance improvements. One report that was using up to ~200.000 instances of the date component got a 50% boost in rendering time. My takeaway was: 1) WODynamicElement is very much faster than WOComponent. Besides, it's fun to write elements in java :). 2) Despite that, WOComponent is amazingly efficient at what it does, my 20 years without seeking a performance improvement by using Dynamic Elements being something of a testament to that. The 50% reduction in rendering time I mentioned is counted in hundreds of milliseconds, even when using tens of thousands of instances of the elements in question. I find that pretty amazing. - hugi > On 8 Aug 2020, at 09:36, Johann Werner via Webobjects-dev > <webobjects-dev@lists.apple.com> wrote: > > Hi Aaron, > > as you mentioned WODynamicElements and documentation about them is very > sparse as well being a special beast, let me say some words about them: > > WOComponent components being the easiest to grasp (and probably most used) > represent a WO tag within your HTML templates i.e. every time a page is > generated for the client its template will be parsed, for every WO tag an > instance of the WOComponent will be created, bindings will be synchronized, > the output generated, and finally—as you stated when that page drops out of > the backtrack cache—gc’ed. This will happen every time that page is called. > If you never requested that page or if it is not present in the backtrack > cache anymore, no instance (read memory) will be present. But that means if > you do request that page WO has first to create a lot of objects which has on > the one hand a performance penalty and on the other hand can lead to memory > peaks as for every request a full instance tree has to be generated. This is > especially important if you are running a high traffic site. > > On the contrary WODynamicElements are special components which are meant to > optimize that use case. Instead of WO creating an instance for every > occurence during output generation, dynamic elements are used as a sort of > output factory. So first time WO encounters a dynamic element it will be > created once (some simplification applied of course ;-) and used for every > page where it appears in the template. This instance is then cached, waiting > to be reused. By this you will have way less instances (did I say way less?) > resulting in less memory consumption and less performance overhead as you > don’t need to create lots of Java objects. > > So from this perspective your application will have a slightly higher minimum > memory consumption as you will keep one instance per dynamic element around > but have less memory peaks as well serving your pages faster. > > One implication of this is that you must not—read you will get into real big > trouble—use internal state / instance variables within a dynamic component. > That kind of component has to be thread safe because WO will reuse the same > object again and again for every component using it. Different users > requesting pages with that component in it means concurrent usage of the > dynamic component. So if you use instance variables: BOOOM, probably even > without you noticing anything but producing wrong output. If you used them > for access checks, that is a dangerous game… To circumvent that you already > mentioned WOAssociations, those will get/set values you need within your > current RR-loop and prevent a mix-match. > > TLDR: use WODynamicElements to optimize your application but know what you > are doing ;-) besides that those kind of components give you many more > features you cannot achieve with normal components. But that is another story. > > And back to the original question: I do not bounce apps either, had even an > application that ran without problems > 2 years in one go. > > Johann > > >> Am 08.08.2020 um 04:27 schrieb Aaron Rosenzweig via Webobjects-dev >> <webobjects-dev@lists.apple.com <mailto:webobjects-dev@lists.apple.com>>: >> >> Thanks everyone, >> >> It seems like a pretty even split between those who cycle daily and those >> who don’t. >> >> Perhaps it depends on the app and what minor leaks it might have tend to >> skew people to cycling daily… or maybe they are old farts, like me, who >> still remember the Objective-C days. It was a bit easier to leak then. >> >> I debugged something this week that was new to me, in this realm, so I >> thought I’d share. >> >> 1. WODynamicElement >> >> It appears that WODynamicElements, or anything that “is a,” don’t fall out >> of memory. Looks like an instance is created for every WOComponent class it >> is used in and never goes away for the life of the app. As users visit pages >> in a large app it creates a lot of WODynamicElements. These are things like >> WOString and WOConditional. We had our own child of WOConditional that did >> some processing based on user access permissions. Internally it was saving >> state including making its own sandboxed EOEditingContext. Because of this, >> that EC had legs and filled up quite a bit of memory in the app. I rewrote >> this WODynamicElement to not have any instance variables with the only >> exception being WOAssociations. >> >> WOComponents do fall out of memory when they fall out of the backtrack >> cache, WODynamicElements do not. Their are strange beasts who don’t have a >> “parent()” and don’t have a “context()” — It’s as if WO decides to cache >> them in memory for future use if they’ve ever been used on a page. Kind of >> like when you do “Integer.valueOf(10)” Java gives you the same instance of >> ten whereas “new Integer(10)” makes a new place in memory for another ten. >> Because ten is always ten, you might argue it’s better to use valueOf and >> get the same object to possibly save time. Others would argue to not do that >> so you can reclaim more. Perhaps a sucky analogy but it helped me think of >> why WODynamicElement doesn’t get reclaimed but WOComponents do. >> >> There are certainly other gotchas… if you have a “previous page” notion and >> don’t use weak references and don’t trim the length of the chain… you’ll >> have a very long lived chain of pages that goes further than the backtrack >> cache. >> >> 2. Full GC occurrences and object histogram >> >> You can dump a histogram of all the objects presently in memory using >> techniques listed here: >> https://medium.com/@jerolba/measuring-actual-memory-consumption-in-java-jmnemohistosyne-5eed2c1edd65 >> >> <https://medium.com/@jerolba/measuring-actual-memory-consumption-in-java-jmnemohistosyne-5eed2c1edd65> >> >> You can register to do something after every GC, such as logging, by using >> techniques listed here: >> http://www.fasterj.com/articles/gcnotifs.shtml >> <http://www.fasterj.com/articles/gcnotifs.shtml> >> >> AARON ROSENZWEIG / Chat 'n Bike <http://www.chatnbike.com/> >> e: aa...@chatnbike.com <mailto:aa...@chatnbike.com> t: (301) 956-2319 >> >> >>> On Aug 6, 2020, at 4:28 AM, Hugi Thordarson via Webobjects-dev >>> <webobjects-dev@lists.apple.com <mailto:webobjects-dev@lists.apple.com>> >>> wrote: >>> >>> I'd like to add a disclaimer to my EOF comment; I now recall I was invoking >>> a method as a workaround for something. Can't for the life of me remember >>> what it was or why (snapshots were getting GCd too early or something so I >>> had to invoke snapshotReferenceCountingSomethingElseOrOther()) but if >>> memory serves me right it might as well have been called >>> "beAwareYouAreNowExplicitlyLeakingMemory()". >>> >>> So—I was being unfair and my leaky EOF was probably because of me doing >>> something stupid :). >>> >>> - hugi >>> >>> >>> >>>> On 6 Aug 2020, at 05:33, Stefan Gärtner via Webobjects-dev >>>> <webobjects-dev@lists.apple.com <mailto:webobjects-dev@lists.apple.com>> >>>> wrote: >>>> >>>> We never bounce, but every few weeks we have an update, which certainly >>>> starts a new instance. >>>> We heavily use EOF. I never had the feeling that there is any memory leak, >>>> at least in our scenario. >>>> >>>> >>>>> Am 06.08.2020 um 00:56 schrieb D Tim Cummings via Webobjects-dev >>>>> <webobjects-dev@lists.apple.com <mailto:webobjects-dev@lists.apple.com>>: >>>>> >>>>> Daily for us. Once every few months we get an instance hanging and it is >>>>> clear at the start of the day that it has hung because it hasn’t >>>>> restarted overnight. >>>>> >>>>> Tim >>>>> >>>>>> On 6 Aug 2020, at 05:37, Lon Varscsak via Webobjects-dev >>>>>> <webobjects-dev@lists.apple.com <mailto:webobjects-dev@lists.apple.com>> >>>>>> wrote: >>>>>> >>>>>> We don't bounce our apps unless we do a release or if there's an >>>>>> instance that hangs. >>>>>> >>>>>> -Lon >>>>>> >>>>>> On Wed, Aug 5, 2020 at 9:09 AM Theodore Petrosky via Webobjects-dev >>>>>> <webobjects-dev@lists.apple.com <mailto:webobjects-dev@lists.apple.com>> >>>>>> wrote: >>>>>> My apps upload pdfs. As Java keeps the temp file that was uploaded until >>>>>> the app that did the upload quits, I bounce my apps every night to clean >>>>>> things up. >>>>>> >>>>>> Ted >>>>>> >>>>>>> On Aug 5, 2020, at 10:37 AM, Ken Anderson via Webobjects-dev >>>>>>> <webobjects-dev@lists.apple.com >>>>>>> <mailto:webobjects-dev@lists.apple.com>> wrote: >>>>>>> >>>>>>> I never bounce them - even with EOF ;) >>>>>>> >>>>>>>> On Aug 5, 2020, at 07:07, Jesse Tayler via Webobjects-dev >>>>>>>> <webobjects-dev@lists.apple.com >>>>>>>> <mailto:webobjects-dev@lists.apple.com>> wrote: >>>>>>>> >>>>>>>> What do you use to keep an eye on memory? JAVA has such an old-school >>>>>>>> approach with the VM I use AWS and really don’t have any good >>>>>>>> automated visualizing report on how instances or JAVA is running under >>>>>>>> the hood. >>>>>>>> >>>>>>>> My apps seem to run for a long time as a few times my scheduler has >>>>>>>> failed and they racked up 10X or even 100X normal sessions, but who >>>>>>>> knows what the user patterns were really — I have had to increase my >>>>>>>> JAVA VM and set memory stuff from JavaMonitor to keep things sane. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> On Aug 5, 2020, at 3:35 AM, Jérémy DE ROYER via Webobjects-dev >>>>>>>>> <webobjects-dev@lists.apple.com >>>>>>>>> <mailto:webobjects-dev@lists.apple.com>> wrote: >>>>>>>>> >>>>>>>>> Hi Aaron, >>>>>>>>> >>>>>>>>> (I’m still using EOF) and, for the main apps, I bounce every morning. >>>>>>>>> >>>>>>>>> After updates I sometimes forget to activate the schedules without >>>>>>>>> any problems… but I’m used to do it in the pasts where I had a lot of >>>>>>>>> meomry leaks so I still do it. >>>>>>>>> >>>>>>>>> Jérémy >>>>>>>>> >>>>>>>>>> Le 5 août 2020 à 00:04, Hugi Thordarson via Webobjects-dev >>>>>>>>>> <webobjects-dev@lists.apple.com >>>>>>>>>> <mailto:webobjects-dev@lists.apple.com>> a écrit : >>>>>>>>>> >>>>>>>>>> Never. Uptime on my apps is usually weeks or months. >>>>>>>>>> >>>>>>>>>> Cycled regularly when I used EOF though. That thing leaks. >>>>>>>>>> >>>>>>>>>> - hugi >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> On 4 Aug 2020, at 21:31, Aaron Rosenzweig via Webobjects-dev >>>>>>>>>>> <webobjects-dev@lists.apple.com >>>>>>>>>>> <mailto:webobjects-dev@lists.apple.com>> wrote: >>>>>>>>>>> >>>>>>>>>>> Personally I feel better bouncing my .woa instances daily. Even if >>>>>>>>>>> it is a small site I have at least two instances and I gracefully >>>>>>>>>>> cycle them on a daily schedule. I feel better knowing that it is >>>>>>>>>>> fresh every morning for the new day. >>>>>>>>>>> >>>>>>>>>>> On the other hand, I could see an argument that a java app >>>>>>>>>>> shouldn’t have any memory leaks. The garbage collector should get >>>>>>>>>>> everything. If it cannot do so, then you’ve got something messed up >>>>>>>>>>> in your app that you should track down and rectify. So maybe it’s >>>>>>>>>>> better to just leave your .woa instances running forever until the >>>>>>>>>>> next redeployment to get new features. >>>>>>>>>>> >>>>>>>>>>> What does the community do? Do you cycle often (daily, twice per >>>>>>>>>>> day, or once per week) or do you leaving your instances running >>>>>>>>>>> without a scheduled restart? >>>>>>>>>>> >>>>>>>>>>> Thanks to all those who chime in :-) >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> Do not post admin requests to the list. They will be ignored. >>>>>>>>>>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>>>>>>>>>> <mailto:Webobjects-dev@lists.apple.com>) >>>>>>>>>>> Help/Unsubscribe/Update your Subscription: >>>>>>>>>>> https://lists.apple.com/mailman/options/webobjects-dev/hugi%40karlmenn.is >>>>>>>>>>> >>>>>>>>>>> <https://lists.apple.com/mailman/options/webobjects-dev/hugi%40karlmenn.is> >>>>>>>>>>> >>>>>>>>>>> This email sent to h...@karlmenn.is <mailto:h...@karlmenn.is> >>>>>>>>>> >>>>>>>>>> _______________________________________________ >>>>>>>>>> Do not post admin requests to the list. They will be ignored. >>>>>>>>>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>>>>>>>>> <mailto:Webobjects-dev@lists.apple.com>) >>>>>>>>>> Help/Unsubscribe/Update your Subscription: >>>>>>>>>> https://lists.apple.com/mailman/options/webobjects-dev/jeremy.deroyer%40ingencys.net >>>>>>>>>> >>>>>>>>>> <https://lists.apple.com/mailman/options/webobjects-dev/jeremy.deroyer%40ingencys.net> >>>>>>>>>> >>>>>>>>>> This email sent to jeremy.dero...@ingencys.net >>>>>>>>>> <mailto:jeremy.dero...@ingencys.net> >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> Do not post admin requests to the list. They will be ignored. >>>>>>>>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>>>>>>>> <mailto:Webobjects-dev@lists.apple.com>) >>>>>>>>> Help/Unsubscribe/Update your Subscription: >>>>>>>>> https://lists.apple.com/mailman/options/webobjects-dev/jtayler%40oeinc.com >>>>>>>>> >>>>>>>>> <https://lists.apple.com/mailman/options/webobjects-dev/jtayler%40oeinc.com> >>>>>>>>> >>>>>>>>> This email sent to jtay...@oeinc.com <mailto:jtay...@oeinc.com> >>>>>>>> _______________________________________________ >>>>>>>> Do not post admin requests to the list. They will be ignored. >>>>>>>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>>>>>>> <mailto:Webobjects-dev@lists.apple.com>) >>>>>>>> Help/Unsubscribe/Update your Subscription: >>>>>>>> https://lists.apple.com/mailman/options/webobjects-dev/kenlists%40anderhome.com >>>>>>>> >>>>>>>> <https://lists.apple.com/mailman/options/webobjects-dev/kenlists%40anderhome.com> >>>>>>>> >>>>>>>> This email sent to kenli...@anderhome.com >>>>>>>> <mailto:kenli...@anderhome.com> >>>>>>> _______________________________________________ >>>>>>> Do not post admin requests to the list. They will be ignored. >>>>>>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>>>>>> <mailto:Webobjects-dev@lists.apple.com>) >>>>>>> Help/Unsubscribe/Update your Subscription: >>>>>>> https://lists.apple.com/mailman/options/webobjects-dev/tedpet5%40yahoo.com >>>>>>> >>>>>>> <https://lists.apple.com/mailman/options/webobjects-dev/tedpet5%40yahoo.com> >>>>>>> >>>>>>> This email sent to tedp...@yahoo.com <mailto:tedp...@yahoo.com> >>>>>> _______________________________________________ >>>>>> Do not post admin requests to the list. They will be ignored. >>>>>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>>>>> <mailto:Webobjects-dev@lists.apple.com>) >>>>>> Help/Unsubscribe/Update your Subscription: >>>>>> https://lists.apple.com/mailman/options/webobjects-dev/lon.varscsak%40gmail.com >>>>>> >>>>>> <https://lists.apple.com/mailman/options/webobjects-dev/lon.varscsak%40gmail.com> >>>>>> >>>>>> This email sent to lon.varsc...@gmail.com <mailto:lon.varsc...@gmail.com> >>>>>> _______________________________________________ >>>>>> Do not post admin requests to the list. They will be ignored. >>>>>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>>>>> <mailto:Webobjects-dev@lists.apple.com>) >>>>>> Help/Unsubscribe/Update your Subscription: >>>>>> https://lists.apple.com/mailman/options/webobjects-dev/tim%40triptera.com.au >>>>>> >>>>>> <https://lists.apple.com/mailman/options/webobjects-dev/tim%40triptera.com.au> >>>>>> >>>>>> This email sent to t...@triptera.com.au <mailto:t...@triptera.com.au> >>>>> >>>>> _______________________________________________ >>>>> Do not post admin requests to the list. They will be ignored. >>>>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>>>> <mailto:Webobjects-dev@lists.apple.com>) >>>>> Help/Unsubscribe/Update your Subscription: >>>>> https://lists.apple.com/mailman/options/webobjects-dev/stefan.gaertner%40nureg.de >>>>> >>>>> <https://lists.apple.com/mailman/options/webobjects-dev/stefan.gaertner%40nureg.de> >>>>> >>>>> This email sent to stefan.gaert...@nureg.de >>>>> <mailto:stefan.gaert...@nureg.de> >>>> >>>> >>>> >>>> -- >>>> Mit freundlichen Grüßen >>>> >>>> Stefan Gärtner >>>> /// IT/Software-Entwicklung /// >>>> >>>> NUREG GmbH /// >>>> Dorfäckerstraße 31 | 90427 Nürnberg | Germany >>>> Tel.: +49-911-32002-183 | Fax: +49-911-32002-299 >>>> Nürnberg HRB 22653 | USt.ID DE 814 685 653 >>>> Geschäftsführer: Michael Schmidt, Stefan Boas >>>> www.nureg.de <http://www.nureg.de/> >>>> >>>> >>>> >>>> _______________________________________________ >>>> Do not post admin requests to the list. They will be ignored. >>>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>>> <mailto:Webobjects-dev@lists.apple.com>) >>>> Help/Unsubscribe/Update your Subscription: >>>> https://lists.apple.com/mailman/options/webobjects-dev/hugi%40karlmenn.is >>>> <https://lists.apple.com/mailman/options/webobjects-dev/hugi%40karlmenn.is> >>>> >>>> This email sent to h...@karlmenn.is <mailto:h...@karlmenn.is> >>> >>> _______________________________________________ >>> Do not post admin requests to the list. They will be ignored. >>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >>> <mailto:Webobjects-dev@lists.apple.com>) >>> Help/Unsubscribe/Update your Subscription: >>> https://lists.apple.com/mailman/options/webobjects-dev/aaron%40chatnbike.com >>> >>> <https://lists.apple.com/mailman/options/webobjects-dev/aaron%40chatnbike.com> >>> >>> This email sent to aa...@chatnbike.com <mailto:aa...@chatnbike.com> >> _______________________________________________ >> Do not post admin requests to the list. They will be ignored. >> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >> <mailto:Webobjects-dev@lists.apple.com>) >> Help/Unsubscribe/Update your Subscription: >> https://lists.apple.com/mailman/options/webobjects-dev/johann.werner%40posteo.de >> >> <https://lists.apple.com/mailman/options/webobjects-dev/johann.werner%40posteo.de> >> >> This email sent to johann.wer...@posteo.de <mailto:johann.wer...@posteo.de> > _______________________________________________ > Do not post admin requests to the list. They will be ignored. > Webobjects-dev mailing list (Webobjects-dev@lists.apple.com) > Help/Unsubscribe/Update your Subscription: > https://lists.apple.com/mailman/options/webobjects-dev/hugi%40karlmenn.is > > This email sent to h...@karlmenn.is
_______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list (Webobjects-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com