[sgen] Number of major objects marked in concurrent DTrace probes.
[mono.git] / mono / metadata / sgen-conf.h
1 /*
2  * sgen-conf.h: Tunable parameters and debugging switches.
3  *
4  * Copyright 2001-2003 Ximian, Inc
5  * Copyright 2003-2010 Novell, Inc.
6  * Copyright 2011 Xamarin Inc (http://www.xamarin.com)
7  * Copyright (C) 2012 Xamarin Inc
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License 2.0 as published by the Free Software Foundation;
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License 2.0 along with this library; if not, write to the Free
20  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  */
22 #ifndef __MONO_SGENCONF_H__
23 #define __MONO_SGENCONF_H__
24
25 /*Basic defines and static tunables */
26
27 #if SIZEOF_VOID_P == 4
28 typedef guint32 mword;
29 #define MWORD_MAX_VALUE ((uint32_t) 0xffffffff)
30 #else
31 typedef guint64 mword;
32 #define MWORD_MAX_VALUE (G_MAXUINT64)
33 #endif
34
35
36 /*
37  * Turning on heavy statistics will turn off the managed allocator and
38  * the managed write barrier.
39  */
40 //#define HEAVY_STATISTICS
41
42 /*
43  * Define this to allow the user to change the nursery size by
44  * specifying its value in the MONO_GC_PARAMS environmental
45  * variable. See mono_gc_base_init for details.
46  */
47 #define USER_CONFIG 1
48
49
50 /*
51  * If this is set, the nursery is aligned to an address aligned to its size, ie.
52  * a 1MB nursery will be aligned to an address divisible by 1MB. This allows us to
53  * speed up ptr_in_nursery () checks which are very frequent. This requires the
54  * nursery size to be a compile time constant.
55  */
56 #define SGEN_ALIGN_NURSERY 1
57
58 /*
59  * The binary protocol enables logging a lot of the GC ativity in a way that is not very
60  * intrusive and produce a compact file that can be searched using a custom tool.
61  *
62  */
63 //#define SGEN_BINARY_PROTOCOL
64
65 /*
66  * This enables checks whenever objects are enqueued in gray queues.
67  * Right now the only check done is that we never enqueue nursery
68  * pointers in the concurrent collector.
69  */
70 //#define SGEN_CHECK_GRAY_OBJECT_ENQUEUE
71
72 /*
73  * Define this and use the "xdomain-checks" MONO_GC_DEBUG option to
74  * have cross-domain checks in the write barrier.
75  */
76 //#define XDOMAIN_CHECKS_IN_WBARRIER
77
78 /*
79  * Define this to get number of objects marked information in the
80  * concurrent GC DTrace probes.  Has a small performance impact, so
81  * it's disabled by default.
82  */
83 //#define SGEN_COUNT_NUMBER_OF_MAJOR_OBJECTS_MARKED
84
85 #ifndef SGEN_BINARY_PROTOCOL
86 #ifndef HEAVY_STATISTICS
87 #define MANAGED_ALLOCATION
88 #ifndef XDOMAIN_CHECKS_IN_WBARRIER
89 #define MANAGED_WBARRIER
90 #endif
91 #endif
92 #endif
93
94 /*
95  * Maximum level of debug to enable on this build.
96  * Making this a constant enables us to put logging in a lot of places and
97  * not pay its cost on release builds.
98  */
99 #define SGEN_MAX_DEBUG_LEVEL 2
100
101 /*
102  * Maximum level of asserts to enable on this build.
103  * FIXME replace all magic numbers with defines.
104  */
105 #define SGEN_MAX_ASSERT_LEVEL 2
106
107
108 #define GC_BITS_PER_WORD (sizeof (mword) * 8)
109
110 /*Size of the section used by the copying GC. */
111 #define SGEN_SIZEOF_GC_MEM_SECTION      ((sizeof (GCMemSection) + 7) & ~7)
112
113 /*
114  * to quickly find the head of an object pinned by a conservative
115  * address we keep track of the objects allocated for each
116  * SGEN_SCAN_START_SIZE memory chunk in the nursery or other memory
117  * sections. Larger values have less memory overhead and bigger
118  * runtime cost. 4-8 KB are reasonable values.
119  */
120 #define SGEN_SCAN_START_SIZE (4096*2)
121
122 /*
123  * Objects bigger then this go into the large object space.  This size
124  * has a few constraints.  It must fit into the major heap, which in
125  * the case of the copying collector means that it must fit into a
126  * pinned chunk.  It must also play well with the GC descriptors, some
127  * of which (DESC_TYPE_RUN_LENGTH, DESC_TYPE_SMALL_BITMAP) encode the
128  * object size.
129  */
130 #define SGEN_MAX_SMALL_OBJ_SIZE 8000
131
132 /*
133  * This is the maximum ammount of memory we're willing to waste in order to speed up allocation.
134  * Wastage comes in thre forms:
135  *
136  * -when building the nursery fragment list, small regions are discarded;
137  * -when allocating memory from a fragment if it ends up below the threshold, we remove it from the fragment list; and
138  * -when allocating a new tlab, we discard the remaining space of the old one
139  *
140  * Increasing this value speeds up allocation but will cause more frequent nursery collections as less space will be used.
141  * Descreasing this value will cause allocation to be slower since we'll have to cycle thru more fragments.
142  * 512 annedoctally keeps wastage under control and doesn't impact allocation performance too much. 
143 */
144 #define SGEN_MAX_NURSERY_WASTE 512
145
146
147 /* This is also the MAJOR_SECTION_SIZE for the copying major
148    collector */
149 #define SGEN_PINNED_CHUNK_SIZE  (128 * 1024)
150
151 /*
152  * Number of entries of a sequential store buffer.
153  * This number represents how frequently we'll have to alloc
154  * a new buffer, so it's a tradeoff of potential wasted space and
155  * increased performance.
156  * 
157  * The current value of 1024 was probably selected because it fits a x86 page.
158  * There's no history on the why's of this value besides this.
159  */
160 #define DEFAULT_REMSET_SIZE 1024
161
162
163 /*
164  * Minimum allowance for nursery allocations, as a multiple of the size of nursery.
165  *
166  * We allow at least this much allocation to happen to the major heap from multiple
167  * minor collections before triggering a major collection.
168  *
169  * Bigger values increases throughput by allowing more garbage to sit in the major heap.
170  * Smaller values leads to better memory effiency but more frequent major collections.
171  */
172 #define SGEN_DEFAULT_ALLOWANCE_NURSERY_SIZE_RATIO 4.0
173
174 #define SGEN_MIN_ALLOWANCE_NURSERY_SIZE_RATIO 1.0
175 #define SGEN_MAX_ALLOWANCE_NURSERY_SIZE_RATIO 10.0
176
177 /*
178  * Default ratio of memory we want to release in a major collection in relation to the the current heap size.
179  *
180  * A major collection target is to free a given amount of memory. This amount is a ratio of the major heap size.
181  *
182  * Values above 0.5 cause the heap to agressively grow when it's small and waste memory when it's big.
183  * Lower values will produce more reasonable sized heaps when it's small, but will be suboptimal at large
184  * sizes as they will use a small fraction only.
185  *
186  */
187 #define SGEN_DEFAULT_SAVE_TARGET_RATIO 0.5
188
189 #define SGEN_MIN_SAVE_TARGET_RATIO 0.1
190 #define SGEN_MAX_SAVE_TARGET_RATIO 2.0
191
192 #endif