This is definitely great stuff. Thanks Johann! Schrag once got into the same 
topic area starting with the magic of WOSwitchComponent.

https://lists.apple.com/archives/webobjects-dev/2008/Oct/msg00501.html 
<https://lists.apple.com/archives/webobjects-dev/2008/Oct/msg00501.html>

I also only bounce when deploying a new build.

Tim
UCLA GSE&IS

> On Aug 8, 2020, at 9:31 PM, Aaron Rosenzweig via Webobjects-dev 
> <webobjects-dev@lists.apple.com> wrote:
> 
> Thank you Johann for chiming in. I appreciate you stating clearly what I 
> intuited that WODynamicElements are “stateless” and I was right to remove all 
> the instance variables that it was using. 
> 
> Love this group of WOrriors - lots of knowledge and friendly folk willing to 
> share and learn together. 
> AARON ROSENZWEIG / Chat 'n Bike <http://www.chatnbike.com/>
> e:  aa...@chatnbike.com <mailto:aa...@chatnbike.com>  t:  (301) 956-2319   
>       
> 
>> On Aug 8, 2020, at 5:36 AM, Johann Werner <johann.wer...@posteo.de 
>> <mailto:johann.wer...@posteo.de>> 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/lists%40thetimmy.com
> 
> This email sent to li...@thetimmy.com

 _______________________________________________
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

Reply via email to