| Author | 
		  Message
		 | 
		
		  | sourdas2 | 
		  
		    
			  
				 Posted: Mon Jul 16, 2012 11:30 pm    Post subject: WMB memory usage within a DataFlowEngine | 
				     | 
			   
			 
		   | 
		
		
		    Voyager
 
 Joined: 21 Apr 2006 Posts: 90 Location: Kolkata,India 
  | 
		  
		    
			  
				I am running WebSphere Message Broker v7.0.0.2 in my local windows machine (Win XP, SP 2). I have only one broker and one execution group running in my machine.
 
 
As per Windows Task Manager, the physical & virtual memory (current usage) of the DataFlowEngine are approximately 208 MB and 216 MB. But as per the accounting & statistics data, the heap memory and non heap memory (current usage) of the same execution group are 19 MB and 29 MB.
 
 
Why is the difference of usage between data reported by Windows Task Manager and Accounting & Statistics ? _________________ Thanks and Warm Regards
 
Sourav | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | lancelotlinc | 
		  
		    
			  
				 Posted: Tue Jul 17, 2012 4:57 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Jedi Knight
 
 Joined: 22 Mar 2010 Posts: 4941 Location: Bloomington, IL USA 
  | 
		  
		    
			  
				There are two memory pools. Task manager is showing you the accumulation of both memory pools. You have a C runtime pool and a JVM pool. _________________ http://leanpub.com/IIB_Tips_and_Tricks
 
Save $20: Coupon Code: MQSERIES_READER | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Esa | 
		  
		    
			  
				 Posted: Wed Jul 18, 2012 12:19 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 22 May 2008 Posts: 1387 Location: Finland 
  | 
		  
		    
			  
				| And the statistics show how much memory from the pools has actually been used by the flows during the sample time interval. | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | sourdas2 | 
		  
		    
			  
				 Posted: Wed Jul 18, 2012 2:31 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Voyager
 
 Joined: 21 Apr 2006 Posts: 90 Location: Kolkata,India 
  | 
		  
		    
			  
				Hi lancelotlinc & Esa, thanks for the reply   
 
 
Is the any documentation / article available on WMB memory structure & memory usage ? _________________ Thanks and Warm Regards
 
Sourav | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | lancelotlinc | 
		  
		    
			  
				 Posted: Wed Jul 18, 2012 3:32 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Jedi Knight
 
 Joined: 22 Mar 2010 Posts: 4941 Location: Bloomington, IL USA 
  | 
		  
		    
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Tibor | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 4:23 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 20 May 2001 Posts: 1033 Location: Hungary 
  | 
		  
		    
			  
				I know, this is a year-old topic, but I have just realized a little bit strange behavior. 
 
 
There is msgflow with a JavaCompute node, which unzipping a file into a folder (FileInput - Java - FileOutput, that's all). Working perfectly, so I've just tested it with a huge zip file: 1900+ entries, every item size 1MB. At the end of the processing, the process size increased to almost 2GB. 
 
 
After a fresh mqsireload:
 
   
	| Code: | 
   
  
	$ ps -fo pid,vsz,args -u mqsi
 
     PID   VSZ COMMAND
 
35913832 87448 DataFlowEngine RAPTOR 61b8491e-3f01-0000-0080-f15679adf26a FTP | 
   
 
 
 
After the processing:
 
   
	| Code: | 
   
  
	     PID   VSZ COMMAND
 
35913832 1970884 DataFlowEngine RAPTOR 61b8491e-3f01-0000-0080-f15679adf26a FTP | 
   
 
 
 
It is slightly perplexing for me, because I don't think it is needed for allocating a new memory area for every messages, reusing same buffer seems more logical to me.
 
 
Is there a good strategy for finding the reason of the memory leak? | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Esa | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 4:35 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 22 May 2008 Posts: 1387 Location: Finland 
  | 
		  
		    
			  
				Hi Tibor, how are you doing?
 
 
First of all, the eg needs to allocate memory for the zipped input message. And then it will have to allocate memory for the ouput message(s). And these two simultaneously.
 
 
I guess you are propagating each entry separately and running the FileOutput in append mode? That way you could achieve lower memory consumption -- if you do things properly. Do you create a new MbMessage for each entry and call clearMemory() after propagating it? | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Tibor | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 4:54 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 20 May 2001 Posts: 1033 Location: Hungary 
  | 
		  
		    
			  
				Hi Esa, everything is fine here... details later  
 
 
The flow is a little bit tricky for avoiding high memory consumption. It is using "End of Data" terminal on FileInput, therefore only the file information is travelling to JavaCompute node. There is no memory allocation for a message.
 
 
Yes, every entries are propagating to FileOutput, but there is no clearMessage() call after them, because I thought it better to use a single new MbMessage() / clearMessage() outside of the loop. | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | McueMart | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 5:20 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Chevalier
 
 Joined: 29 Nov 2011 Posts: 490 Location: UK...somewhere 
  | 
		  
		    
			  
				| Can you show us the code you are using? Or at least pseudo-code... | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Tibor | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 5:29 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 20 May 2001 Posts: 1033 Location: Hungary 
  | 
		  
		    
			  
				This is the code:
 
   
	| Code: | 
   
  
	import java.io.*;
 
import java.util.zip.ZipEntry;
 
import java.util.zip.ZipInputStream;
 
 
import com.ibm.broker.javacompute.MbJavaComputeNode;
 
import com.ibm.broker.plugin.*;
 
 
public class IK_Sub_Unzip extends MbJavaComputeNode {
 
 
   static String LinePref = "Unzip.java: "; 
 
   
 
   public void evaluate(MbMessageAssembly contact admin) throws MbException {
 
      MbOutputTerminal out = getOutputTerminal("out");
 
 
      MbMessage outMessage = new MbMessage();
 
 
      try {
 
         // set variables for Message & Root 
 
         MbMessage inMessage = contact admin.getLocalEnvironment();
 
         MbElement inRoot = inMessage.getRootElement();
 
         MbElement outRoot = outMessage.getRootElement();
 
   
 
         // create BLOB parser element on OutputRoot
 
         MbElement outParser = 
 
            outRoot.createElementAsLastChild(MbBLOB.PARSER_NAME);
 
         MbMessageAssembly outAssembly = new MbMessageAssembly(contact admin,
 
               outMessage);
 
 
         // get values of InputLocalEnvironment.File.Name, ...
 
         String fileName = 
 
            (String)inRoot.getFirstElementByPath("/File/Name").getValue();
 
         String filePath = 
 
            (String)inRoot.getFirstElementByPath("/File/Directory").getValue();
 
 
         // file path: "<path>/mqsitransitin", file name: "<uniqId>_<filename>"
 
         String zipPath = filePath + File.separator + "mqsitransitin";
 
         String zipFile = "";
 
         for( File f : new File(zipPath).listFiles()) {
 
            zipFile = f.getName();
 
            if (zipFile.endsWith(fileName) && f.isFile()) {
 
               break;
 
            }
 
         }
 
 
         zipFile = zipPath + File.separator + zipFile;
 
         System.out.println(LinePref + "filename=" + zipFile);
 
         
 
         // access Environment tree
 
         MbMessage outEnv = outAssembly.getLocalEnvironment();
 
         MbElement envTree;
 
         // create a subtree for file name in LocalEnvironment tree
 
         // LocalEnvironment.Destination.File.Name
 
         envTree = outEnv.getRootElement().createElementAsLastChild(
 
               MbElement.TYPE_NAME, "Destination", "" );
 
         envTree = envTree.createElementAsLastChild(
 
               MbElement.TYPE_NAME, "File", "" );
 
         MbElement envFileName = envTree.createElementAsLastChild(
 
               MbElement.TYPE_NAME_VALUE, "Name", "");
 
 
         // date format for file timestamps
 
         //SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
 
 
         // open the ZIP file stream
 
           InputStream theFile = new FileInputStream(zipFile);
 
           ZipInputStream zipStream = new ZipInputStream(theFile);
 
         System.out.println(LinePref + "open stream");
 
         // getting first entry
 
         ZipEntry entry = zipStream.getNextEntry();
 
 
         // counter for propagated messages
 
         int propagated = 0;
 
 
         StringBuffer sb_result = new StringBuffer();
 
         byte[] str_buffer = new byte[32 * 1024];
 
 
         while( entry != null) {
 
            // trace message to stdout 
 
            System.out.println(LinePref + "extract " + entry.getName());
 
            
 
            if(!entry.isDirectory()) {
 
               // process only if entry is not a directory
 
               String entryName = entry.getName();
 
               sb_result.setLength(0);
 
 
               // unzip an entry
 
               int len;
 
               while((len = zipStream.read(str_buffer)) > 0) {
 
                  sb_result.append(new String(str_buffer, 0, len));
 
               }
 
 
               //String result = sb_result.toString();
 
               //msgBytes = result.getBytes();
 
 
               // create name/value element in the BLOB parser
 
               // name="BLOB", value=<file content>
 
               MbElement outBody = outParser.createElementAsLastChild( 
 
                  MbElement.TYPE_NAME_VALUE, 
 
                  "BLOB", 
 
                  sb_result.toString().getBytes());
 
                  //msgBytes);
 
 
               // add file info to LocalEnvironment tree
 
               envFileName.setValue(entryName);
 
               
 
               // propagate message then clear message body (file content)
 
               out.propagate(outAssembly);
 
//               System.out.println(LinePref + "propagated");
 
               outBody.detach();
 
//               System.out.println(LinePref + "detached");
 
               propagated ++;
 
            }
 
   
 
            // getting next entry
 
            entry = zipStream.getNextEntry();
 
         }
 
 
         // closing ZIP stream
 
         zipStream.closeEntry();
 
         System.out.println(LinePref + "close stream");
 
         
 
         // throw exception if there are no messages
 
         if( propagated == 0) {
 
            throw new MbRecoverableException(
 
                  "IK_Sub_Unzip",
 
                  "unzip",
 
                  "",
 
                  "",
 
                  "",
 
                  null);
 
         }
 
 
      } catch (MbException mbex) {
 
         traverse(mbex,0);
 
         throw mbex;
 
      } catch (IOException ioex) {
 
         System.out.println(LinePref + "Error processing Unzip.");
 
         ioex.printStackTrace();
 
      } finally {
 
         // clear the outMessage
 
         outMessage.clearMessage();
 
      }
 
   }
 
 
   void traverse(MbException ex, int level) {
 
       if(ex != null) {
 
           // Do whatever action here
 
           System.out.println(LinePref + "Level: " + level);
 
           System.out.println(LinePref + "Exception: " + ex.toString());
 
           System.out.println(LinePref + "TraceText:  " + ex.getTraceText());
 
 
           // stack trace at top level (to stderr)
 
           if(level == 0) {
 
              ex.printStackTrace();
 
           }
 
 
           // traverse the hierarchy
 
           MbException e[] = ex.getNestedExceptions();
 
           int size = e.length;
 
           for(int i = 0; i < size; i++) {
 
               traverse(e[i], level + 1);
 
           }
 
       }
 
   }
 
    
 
} | 
   
 
 | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Esa | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 5:37 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 22 May 2008 Posts: 1387 Location: Finland 
  | 
		  
		    
			  
				Tibor,
 
 
I think this is where you go wrong:
 
 
 | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Tibor | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 6:08 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 20 May 2001 Posts: 1033 Location: Hungary 
  | 
		  
		    
			  
				Esa, without detach(), the output message is increasing continuously...   | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Esa | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 6:15 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 22 May 2008 Posts: 1387 Location: Finland 
  | 
		  
		    
			  
				The problem with detach() is that is doesn't release memory until the node terminates.
 
 
Try delete() instead. | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Tibor | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 6:18 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 20 May 2001 Posts: 1033 Location: Hungary 
  | 
		  
		    
			  
				It's a kind of magic of forum engine, but there was no contact admin in my Java code. You should change it to i.n.A.s.s.e.m.b.l.y   | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | Esa | 
		  
		    
			  
				 Posted: Tue Jun 11, 2013 6:55 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Grand Master
 
 Joined: 22 May 2008 Posts: 1387 Location: Finland 
  | 
		  
		    
			  
				That is a known "feature". A somewhat perverse parental control filter.
 
 
But it filters the Preview, too. If you have the good habit of previewing your post before submitting, you can modify the "bad" words so that they pass the filter.
 
 
And take a look at my previous reply. | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | 
		    
		   |