1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 //_________________________________________________________________________
17 /*Basic Memory Leak utility.
19 You can use this tiny class to *see* if your program is leaking.
23 AliPHOSMemoryWatcher memwatcher;
25 some program loop on events here {
26 if ( nevents % x == 0 )
28 // take a sample every x events
29 memwatcher.watch(nevents);
33 TFile f("out.root","RECREATE");
37 In the output root file you'll get 3 graphs representing
38 the evolAliPHOSon, as a function of the number of events, of :
39 - VSIZE is the virtual size (in KBytes) of your program, that is sort of
41 - RSSIZE is the resident size (in KBytes), that is, the part of your
42 program which is really in physical memory.
43 - TIME is an estimate of time per event (really it's the time elasped
44 between two calls to watch method)
46 WARNING: this is far from a bulletproof memory report (it's basically
47 using UNIX command ps -h -p [PID] -o vsize,rssize to do its job).
48 It has only been tested on Linux so far.
50 But by fitting the VSIZE by a pol1 under ROOT, you'll see right away
51 by how much your program is leaking.
53 //*-- Author: Laurent Aphecetche(SUBATECH)
62 // --- AliRoot header files ---
63 #include "AliPHOSMemoryWatcher.h"
65 // --- ROOT system ---
69 #include "TStopwatch.h"
71 //_____________________________________________________________________________
72 AliPHOSMemoryWatcher::AliPHOSMemoryWatcher(unsigned int maxsize)
75 fPID = gSystem->GetPid();
76 sprintf(fCmd,"ps -h -p %d -o vsize,rssize",fPID);
78 fX = new int[fMAXSIZE];
79 fVSIZE = new int[fMAXSIZE];
80 fRSSIZE = new int[fMAXSIZE];
81 fTIME = new double[fMAXSIZE];
87 //_____________________________________________________________________________
88 AliPHOSMemoryWatcher::~AliPHOSMemoryWatcher()
97 //_____________________________________________________________________________
98 void AliPHOSMemoryWatcher::watch(int x)
100 if ( !fDisabled && fSize < fMAXSIZE ) {
104 fTimer = new TStopwatch;
109 static int vsize, rssize;
111 static FILE* pipe = 0;
113 pipe = popen(fCmd,"r");
117 fscanf(pipe,"%d %d",&vsize,&rssize);
120 fVSIZE[fSize] = vsize ;
121 fRSSIZE[fSize] = rssize ;
122 fTIME[fSize] = fTimer->CpuTime();
126 assert(pclose(pipe)!=-1);
133 cerr << "AliPHOSMemoryWatcher::watch : I'm full !" << endl;
137 //_____________________________________________________________________________
139 AliPHOSMemoryWatcher::graphVSIZE(void)
145 g = new TGraph(size());
146 for (int i=0; i < g->GetN(); i++ ) {
147 g->SetPoint(i,X(i),VSIZE(i));
153 //_____________________________________________________________________________
155 AliPHOSMemoryWatcher::graphRSSIZE(void)
160 g = new TGraph(size());
161 for (int i=0; i < g->GetN(); i++ ) {
162 g->SetPoint(i,X(i),RSSIZE(i));
168 //_____________________________________________________________________________
170 AliPHOSMemoryWatcher::graphTIME(void)
175 g = new TGraph(size());
176 for (int i=0; i < g->GetN(); i++ ) {
177 g->SetPoint(i,X(i),TIME(i));
183 //_____________________________________________________________________________
185 AliPHOSMemoryWatcher::frame(void)
192 for (unsigned int i=0; i < size() ; i++ ) {
193 if ( X(i) < xmin ) xmin = X(i);
194 if ( X(i) > xmax ) xmax = X(i);
196 double y = VSIZE(i)+RSSIZE(i);
198 if ( y > ymax ) ymax = y;
200 if ( VSIZE(i) < ymin ) ymin = VSIZE(i);
201 if ( RSSIZE(i) < ymin ) ymin = RSSIZE(i);
204 TH2F* h = new TH2F("frame","",10,xmin,xmax,10,ymin*0.8,ymax*1.2);
209 //_____________________________________________________________________________
211 AliPHOSMemoryWatcher::write(void)
213 if ( graphVSIZE() ) graphVSIZE()->Write("VSIZE",TObject::kOverwrite);
214 if ( graphRSSIZE() ) graphRSSIZE()->Write("RSSIZE",TObject::kOverwrite);
215 if ( graphTIME() ) graphTIME()->Write("TIME",TObject::kOverwrite);