Thank you! Will report back, once I concluded the analysis, which may take a 
while.

---rony


On 27.04.2017 16:53, Rick McGuire wrote:
> The memory manager will force any pending uninits to be run before it gives 
> up and issues the out
> of resources error messages. I really suspect something in the way your code 
> is creating the
> proxies and tracking them is preventing the objects from being identified as 
> dead objects, so
> these objects will just keep accumulating. The more live objects locked in 
> memory, the longer a GC
> cycle will take because there is a larger live set to mark. 
>
> Rick
>
> On Thu, Apr 27, 2017 at 10:34 AM, Rony G. Flatscher <rony.flatsc...@wu.ac.at
> <mailto:rony.flatsc...@wu.ac.at>> wrote:
>
>     Further information, using the initial e-mail to keep all relevant 
> information in one e-mail.
>
>     Today I uninstalled the 32-bit ooRexx 5.0beta and installed the 64-bit 
> ooRexx 5.0beta (both
>     from SourceForge, downloaded February 4th 2017).
>
>     This time the program ran successfully to the end:
>
>       * there were more than 247,000 XML elements processed
>           o as already mentioned this may translate into million(s) call 
> backs from Java to Rexx
>             as all SAX events will cause callbacks to Rexx
>               + some of these callbacks carry Java objects as arguments which 
> will get wrapped as
>                 a peer ooRexx object (ultimately an instance of the class 
> .BSF that has an uninit
>                 method defined), namely the Java types: "char[]", 
> "Attributes", "Local" from the
>                 callbacks 
>                 
> <https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html
>                 
> <https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html>>
>               + there are no return values (all callbacks are defined to be 
> void)
>
>       * it took a total of 2:37 hours to SAX-parse a 10MB XML file,
>           o the SAX-parsing was over after 1:45 hours
>               + the program constantly slowed down and in between paused for 
> a while (which got
>                 longer and longer over time)
>           o after the SAX-parseing was over the Rexx program needed another  
> 0:52 hours to complete
>               + speculating/assuming that in this time all the uninits got 
> executed (which is fine)
>
>       * it consumed 8.7GB of memory
>           o ProcessExplorer reports a
>               + Physical Memory "PeekWorking Set" of 8.795.796 K
>               + Virtual Memory "Virtual Size" of 13.404.424 K with "Peak 
> Private Bytes" of 9.138.664 K
>
>       * it used 24% of the CPU over all 2:37 hours
>           o ProcessExplorer reports a
>               + "Kernel Time" of 0:01:10.184
>               + "User Time" of 2.32.57.960
>               + "Total Time" of  2:34:08.144
>               + "Cycles": 23.898.290.997.693
>
>     Will check the BSF4ooRexx call and code paths.
>
>     ---rony
>
>
>
>     On 26.04.2017 20:28, Rony G. Flatscher wrote:
>>
>>     A student is using BSF4ooRexx to parse a huge XML file using Java's SAX 
>> parser.
>>
>>     The SAX (simple API for XML) works with a callback concept. In order to 
>> be eligible for these
>>     SAX callbacks the ContentHandler interface
>>     
>> <https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html>
>>     
>> <https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html> 
>> must be
>>     implemented, which the Rexx program does with the help of BSF4ooRexx.
>>
>>     As a result each single SAX event will cause an appropriate Rexx message 
>> to be generated and
>>     dispatched.  The Rexx message is named after the ContentHandler method 
>> name and will receive
>>     all arguments documented there. All arguments are processed in native 
>> code, a Rexx array
>>     object will get created from the Java arguments.
>>
>>     This works and was presented on one of the International Rexx symposiums 
>> and has become part
>>     of my lecture using Java camouflaged as ooRexx with the help of 
>> BSF4ooRexx. Here is a link to
>>     the symposium which contains links to the slides:
>>     <http://rexxla.org/events/2013/schedule.html> 
>> <http://rexxla.org/events/2013/schedule.html>.
>>
>>     Now, a student is in the need to parse a rather huge XML file (10 MB) 
>> and uses the SAX
>>     parser. She always hits the Rexx "Error 5: System resources exhausted"! 
>> I asked her to come
>>     up with a very small program to demonstrate the error and I am able to 
>> reproduce it reliably!
>>
>>     Here is the rather short Rexx program:
>>     --- #!/usr/bin/rexx parse arg xmlFile if xmlFile="" then 
>> XMLFile="..\LB-HB.onlb" if
>>     sysFileExists(xmlFile)=.false then do say "File" pp(xmlFile) "does not 
>> exist, aborting." exit
>>     -1 end rexxObject=.saxHandler~new();
>>     javaProxy=BSFCreateRexxProxy(rexxObject,,"org.xml.sax.ContentHandler")
>>     
>> parser=bsf.loadClass("org.xml.sax.helpers.XMLReaderFactory")~createXMLReader
>>     parser~setContentHandler(javaProxy) eh=.errorHandler~new
>>     javaEH=BsfCreateRexxProxy(eh,,"org.xml.sax.ErrorHandler") 
>> parser~setErrorHandler(javaEH)
>>     signal on syntax start=.dateTime~new say pp(start)": start of parsing" 
>> parser~parse(XMLFile)
>>     end=.dateTime~new say pp(end)": end of parsing" say "done, needed:" 
>> pp(end-start) exit
>>     syntax: say "error at" rexxObject~nrOfElements "element" 
>> co=condition('o') say
>>     ppCondition2(co) ::requires "BSF.CLS" /* get the Java support */ 
>> ::requires "rgf_util2.rex"
>>     ::CLASS "SaxHandler" -- a Rexx content handler 
>> ("org.xml.sax.ContentHandler") ::attribute
>>     nrOfElements ::METHOD init --ooRexx constructor expose nrOfElements 
>> nrOfElements=0 ::METHOD
>>     startElement expose nrOfElements USE ARG uri, localName, qName, 
>> attributes nrOfElements+=1 if
>>     nrOfElements//1000=0 then say nrOfElements "elements so far ..." 
>> ::METHOD characters -- the
>>     callback method for characters (text) USE ARG charArray, start, length 
>> ::METHOD endElement
>>     USE ARG uri, localName, qName, attributes ::method unknown ::class 
>> ErrorHandler ::method
>>     unknown use arg methName, argArray exception=argArray[1]s 
>> .error~say(methName": "
>>     "line="exception~getLineNumber ",col="exception~getColumnNumber": " 
>> pp(exception~getMessage))
>>     ---
>>     As you might see, there is nothing "special" going on here, other than 
>> being able to supply a
>>     Rexx object as the callback object for the Java implemented SAX parser! 
>> It seems that running
>>     all these callback from Java to Rexx will cause eventually that ooRexx 
>> gets exhausted of
>>     system resources. While running the program it can be observed that from 
>> time to time there
>>     are little lags as if some garbage collecting takes place. Eventually 
>> the error 5 is thrown,
>>     while executing in native code:
>>
>>         result_obj=rtc->SendMessage(ro, c_msg, ra); // with arguments
>>
>>     Please note that the following error message only gives the numbers of 
>> XML elements that the
>>     SAX parser reported. In reality, *all* callbacks are carried out from 
>> Java to Rexx, the
>>     unprocessed ones will be intercepted by the Rexx UNKNOWN method. So 
>> there is a flurry of
>>     context switches and creation of Rexx array objects for the arguments 
>> and the like. Here is
>>     the error message on my system.
>>     --- 83000 elements so far ... 84000 elements so far ... error at 84926 
>> element [ADDITIONAL]
>>     =[an Array (2 items) id#_-1457160369] ["BSF4ooRexx/routine/BSF(), error 
>> 3: Java exception
>>     occurred: [org.rexxla.bsf.engines.rexx.RexxException:
>>     BSF4ooRexx/routine/jniRexxSendMessageToRexxObject(), error 4:" || "0A"x 
>> || " *-* Compiled
>>     method ""OBJECTNAME="" with scope ""Object""." || "0A"x || "Error 5 
>> running C:\Program Files
>>     (x86)\BSF4ooRexx\BSF.CLS line 2644: System resources exhausted." || 
>> "0A"x || "Error 5.0:
>>     message n/a]"] [org.rexxla.bsf.engines.rexx.RexxException@182d820 
>> id#_-1478994985] [CODE]
>>     =[40.900] [CONDITION] =[SYNTAX] [DESCRIPTION]=[] [ERRORTEXT] =[Incorrect 
>> call to routine.]
>>     [INSTRUCTION]=[SIGNAL] [MESSAGE] =["BSF4ooRexx/routine/BSF(), error 3: 
>> Java exception
>>     occurred: [org.rexxla.bsf.engines.rexx.RexxException:
>>     BSF4ooRexx/routine/jniRexxSendMessageToRexxObject(), error 4:" || "0A"x 
>> || " *-* Compiled
>>     method ""OBJECTNAME="" with scope ""Object""." || "0A"x || "Error 5 
>> running C:\Program Files
>>     (x86)\BSF4ooRexx\BSF.CLS line 2644: System resources exhausted." || 
>> "0A"x || "Error 5.0:
>>     message n/a]."] [PACKAGE] =[a Package id#_-2109388833] [POSITION] =[25] 
>> [PROGRAM]
>>     =[F:\tmp\orx\kirisits\20170425\SAX_noAlerts.rxj] [PROPAGATED] =[1] [RC] 
>> =[40]
>>     [STACKFRAMES]=[a List (4 items) id#_-1467321073] [ *-* Compiled routine 
>> "BSF".
>>     id#_-1939043649] [ 1811 *-* res=BSF( "invoke",
>>     "com.sun.org.apache.xerces.internal.parsers.SAXParser@117ae12", "PARSE" 
>> , a.1 )
>>     id#_-1938526417] [ 1813 *-* interpret code ")" -- execute this 
>> dynamically created Rexx
>>     string id#_-1937397361] [ 25 *-* parser~parse(XMLFile) id#_-1936143753] 
>> [TRACEBACK] =[a List
>>     (4 items) id#_-1458379065] [ *-* Compiled routine "BSF".] [ 1811 *-* 
>> res=BSF( "invoke",
>>     "com.sun.org.apache.xerces.internal.parsers.SAXParser@117ae12", "PARSE" 
>> , a.1 )] [ 1813 *-*
>>     interpret code ")" -- execute this dynamically created Rexx string] [ 25 
>> *-*
>>     parser~parse(XMLFile)] ---
>>     The traceback points to the invocation of the SAX parser from Rexx which 
>> only returns upon
>>     completion of the Java parse method, or in this case when an error 
>> interrupts the program.
>>     --- So now my question/request: how to debug this problem/error? How can 
>> I get more
>>     information from the ooRexx interpreter? How can one determine what kind 
>> of "system
>>     resources" got exhausted and what the cause would be? Can one e.g. 
>> determine how many Rexx
>>     objects there are and how many are dead, in the need of getting garbage 
>> collected? In this
>>     case whenever (on each SAX callback) the Java side invokes the native 
>> code which then sends
>>     the message to the Rexx object there will be an AttachThread() followed 
>> by a DetachThread().
>>     Please advise! ---rony 
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to