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 1224 - (view) (download) (as text)

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

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