Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/runtime/gc/gc-stats.c
ViewVC logotype

Annotation of /sml/trunk/src/runtime/gc/gc-stats.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 249 - (view) (download) (as text)
Original Path: sml/branches/SMLNJ/src/runtime/gc/gc-stats.c

1 : monnier 249 /* gc-stats.c
2 :     *
3 :     * COPYRIGHT (c) 1993 by AT&T Bell Laboratories.
4 :     *
5 :     * Support routines for gathering GC statistics.
6 :     */
7 :    
8 :     #include "ml-osdep.h"
9 :     #include <sys/time.h>
10 :     #include <sys/resource.h>
11 :     #include "ml-base.h"
12 :     #include "ml-limits.h"
13 :     #include "ml-state.h"
14 :     #include "heap.h"
15 :     #include "cntr.h"
16 :     #include "gc-stats.h"
17 :    
18 :     FILE *DebugF;
19 :     FILE *StatsF;
20 :    
21 :     /** Virtual memory statistics **/
22 :     #ifdef VM_STATS
23 :    
24 :     #define ROUND1K(X) (((X)+512)/1024)
25 :    
26 :     /* ReportVM:
27 :     *
28 :     */
29 :     void ReportVM (ml_state_t *msp, int maxCollectedGen)
30 :     {
31 :     heap_t *heap = msp->ml_heap;
32 :     int kbytesPerPage = GETPAGESIZE()/1024;
33 :     FILE *f = (StatsF == NULL) ? DebugF : StatsF;
34 :     struct rusage ru;
35 :     Addr_t bytesAllocated, oldBytes, vmAlloc;
36 :     int i, j;
37 :    
38 :     getrusage(RUSAGE_SELF, &ru);
39 :    
40 :     #ifdef XXX
41 :     bytesAllocated = ((Addr_t)(msp->ml_allocPtr) - (Addr_t)(heap->allocBase));
42 :     #else
43 :     bytesAllocated = 0;
44 :     #endif
45 :    
46 :     /* count size of older generations */
47 :     oldBytes = 0;
48 :     for (i = 0; i < heap->numGens; i++) {
49 :     for (j = 0; j < NUM_ARENAS; j++) {
50 :     arena_t *ap = heap->gen[i]->arena[j];
51 :     if (i < maxCollectedGen) {
52 :     if (ap->frspSizeB > 0)
53 :     oldBytes += ((Addr_t)(ap->frspTop) - (Addr_t)(ap->frspBase));
54 :     }
55 :     else {
56 :     if (isACTIVE(ap))
57 :     oldBytes += ((Addr_t)(ap->nextw) - (Addr_t)(ap->tospBase));
58 :     }
59 :     }
60 :     /* count code objects too! */
61 :     for (j = 0; j < NUM_BIGOBJ_KINDS; j++) {
62 :     bigobj_desc_t *dp = heap->gen[i]->bigObjs[j];
63 :     for (; dp != NIL(bigobj_desc_t *); dp = dp->next) {
64 :     oldBytes += dp->sizeB;
65 :     }
66 :     }
67 :     }
68 :    
69 :     /* get amount of allocated VM (in Kb) */
70 :     vmAlloc = MEM_GetVMSize();
71 :    
72 :     fprintf (f, "VM{alloc=");
73 :     CNTR_FPRINTF (f, &(heap->numAlloc), 10);
74 :     fprintf (f, ", new=%dk, old=%dk, tot=%dk, max_rss=%d}\n",
75 :     ROUND1K(bytesAllocated),
76 :     ROUND1K(oldBytes),
77 :     vmAlloc,
78 :     ru.ru_maxrss*kbytesPerPage);
79 :     fflush (f);
80 :    
81 :     } /* end of ReportVM */
82 :    
83 :     #endif
84 :    
85 :    
86 :     /** Pause time statistics **/
87 :     #ifdef PAUSE_STATS
88 :    
89 :     pause_info_t PauseTbl[MAX_NGENS+1];
90 :    
91 :     /* InitPauseTbl:
92 :     */
93 :     void InitPauseTbl ()
94 :     {
95 :     int i;
96 :    
97 :     for (i = 0; i <= MAX_NGENS; i++) {
98 :     PauseTbl[i].numGCs = 0;
99 :     PauseTbl[i].maxPause = 0;
100 :     PauseTbl[i].buckets = NIL(short *);
101 :     }
102 :    
103 :     GrowPauseTbl (0, MS_TO_BUCKET(500));
104 :     GrowPauseTbl (1, MS_TO_BUCKET(1000));
105 :     GrowPauseTbl (2, MS_TO_BUCKET(2000));
106 :     GrowPauseTbl (3, MS_TO_BUCKET(3000));
107 :     GrowPauseTbl (4, MS_TO_BUCKET(3000));
108 :     GrowPauseTbl (5, MS_TO_BUCKET(4000));
109 :     GrowPauseTbl (6, MS_TO_BUCKET(4000));
110 :    
111 :     } /* end of InitPauseTbl */
112 :    
113 :     /* GrowPauseTbl:
114 :     *
115 :     */
116 :     void GrowPauseTbl (int gen, int pause)
117 :     {
118 :     pause_info_t *p = &(PauseTbl[gen]);
119 :     short *buckets = p->buckets, *new;
120 :     int sz, i;
121 :    
122 :     for (sz = (p->maxPause ? p->maxPause : 16); sz < pause; sz = sz+sz)
123 :     continue;
124 :     new = NEW_VEC(short, sz);
125 :    
126 :     if (buckets != NIL(short *)) {
127 :     for (i = 0; i < p->maxPause; i++)
128 :     new[i] = buckets[i];
129 :     for (; i < sz; i++)
130 :     new[i] = 0;
131 :     FREE (buckets);
132 :     }
133 :     else {
134 :     for (i = 0; i < sz; i++)
135 :     new[i] = 0;
136 :     }
137 :    
138 :     p->buckets = new;
139 :     p->maxPause = sz;
140 :    
141 :     } /* end of GrowPauseTbl */
142 :    
143 :     /* ReportPauses:
144 :     *
145 :     */
146 :     void ReportPauses (FILE *f)
147 :     {
148 :     pause_info_t *infop;
149 :     int i, j, k, n, maxPause;
150 :    
151 :     /* compute the largest maxPause time */
152 :     maxPause = 100; /* one second */
153 :     for (i = MAX_NGENS; i > 0; i--) {
154 :     infop = &(PauseTbl[i]);
155 :     if ((infop->numGCs > 0) && (infop->maxPause > maxPause)) {
156 :     for (j = infop->maxPause-1; (j > maxPause) && (infop->buckets[j] == 0); j--)
157 :     continue;
158 :     if (j > maxPause)
159 :     maxPause = ((j+99)/100)*100;
160 :     }
161 :     }
162 :    
163 :     fprintf(f, "newgraph\n");
164 :     fprintf(f, " xaxis\n");
165 :     fprintf(f, " label : GC Pause Times (ms)\n");
166 :     fprintf(f, " no_auto_hash_marks\n");
167 :     fprintf(f, " size 4.5\n");
168 :     fprintf(f, " min -10 max %d\n", maxPause);
169 :     for (i = 0; i <= maxPause; i += 50)
170 :     fprintf(f, " hash_at %4d hash_label at %4d : %4d\n", i, i, i*10);
171 :     fprintf(f, " yaxis\n");
172 :     fprintf(f, " label : Number of pauses\n");
173 :     fprintf(f, " min 0\n");
174 :    
175 :     for (i = MAX_NGENS; i > 0; i--) {
176 :     infop = &(PauseTbl[i]);
177 :     if (infop->numGCs == 0)
178 :     continue;
179 :     fprintf(f, " (* generation %d pause times *)\n", i);
180 :     fprintf(f, " newcurve\n");
181 :     fprintf(f, " label : Generation %d\n", i);
182 :     fprintf(f, " marktype xbar\n");
183 :     fprintf(f, " pts\n");
184 :     for (j = 0; j < infop->maxPause; j++) {
185 :     if (infop->buckets[j] == 0)
186 :     continue;
187 :     for (k = 1, n = 0; k <= i; k++) {
188 :     if (PauseTbl[k].maxPause >= j)
189 :     n += PauseTbl[k].buckets[j];
190 :     }
191 :     fprintf(f, " %4d %3d\n", j*10, n);
192 :     }
193 :     }
194 :    
195 :     fflush (f);
196 :    
197 :     } /* end of ReportPauses */
198 :    
199 :     #endif

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0