<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Garbage Collector Tuning in Pathological Allocation Pattern Applications</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Nahuel</forename><surname>Palumbo</surname></persName>
							<email>nahuel.palumbo@inria.fr</email>
							<affiliation key="aff0">
								<orgName type="laboratory">UMR 9189</orgName>
								<orgName type="institution" key="instit1">Univ. Lille</orgName>
								<orgName type="institution" key="instit2">Inria</orgName>
								<orgName type="institution" key="instit3">CNRS</orgName>
								<orgName type="institution" key="instit4">Centrale Lille</orgName>
								<address>
									<addrLine>CRIStAL</addrLine>
									<postCode>F-59000</postCode>
									<settlement>Lille</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Sebastian</forename><forename type="middle">Jordan</forename><surname>Montaño</surname></persName>
							<email>sebastian.jordan@inria.fr</email>
							<affiliation key="aff0">
								<orgName type="laboratory">UMR 9189</orgName>
								<orgName type="institution" key="instit1">Univ. Lille</orgName>
								<orgName type="institution" key="instit2">Inria</orgName>
								<orgName type="institution" key="instit3">CNRS</orgName>
								<orgName type="institution" key="instit4">Centrale Lille</orgName>
								<address>
									<addrLine>CRIStAL</addrLine>
									<postCode>F-59000</postCode>
									<settlement>Lille</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Guillermo</forename><surname>Polito</surname></persName>
							<email>guillermo.polito@inria.fr</email>
							<affiliation key="aff0">
								<orgName type="laboratory">UMR 9189</orgName>
								<orgName type="institution" key="instit1">Univ. Lille</orgName>
								<orgName type="institution" key="instit2">Inria</orgName>
								<orgName type="institution" key="instit3">CNRS</orgName>
								<orgName type="institution" key="instit4">Centrale Lille</orgName>
								<address>
									<addrLine>CRIStAL</addrLine>
									<postCode>F-59000</postCode>
									<settlement>Lille</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Pablo</forename><surname>Tesone</surname></persName>
							<email>pablo.tesone@inria.fr</email>
							<affiliation key="aff0">
								<orgName type="laboratory">UMR 9189</orgName>
								<orgName type="institution" key="instit1">Univ. Lille</orgName>
								<orgName type="institution" key="instit2">Inria</orgName>
								<orgName type="institution" key="instit3">CNRS</orgName>
								<orgName type="institution" key="instit4">Centrale Lille</orgName>
								<address>
									<addrLine>CRIStAL</addrLine>
									<postCode>F-59000</postCode>
									<settlement>Lille</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Stéphane</forename><surname>Ducasse</surname></persName>
							<email>stephane.ducasse@inria.fr</email>
							<affiliation key="aff0">
								<orgName type="laboratory">UMR 9189</orgName>
								<orgName type="institution" key="instit1">Univ. Lille</orgName>
								<orgName type="institution" key="instit2">Inria</orgName>
								<orgName type="institution" key="instit3">CNRS</orgName>
								<orgName type="institution" key="instit4">Centrale Lille</orgName>
								<address>
									<addrLine>CRIStAL</addrLine>
									<postCode>F-59000</postCode>
									<settlement>Lille</settlement>
									<country key="FR">France</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Garbage Collector Tuning in Pathological Allocation Pattern Applications</title>
					</analytic>
					<monogr>
						<idno type="ISSN">1613-0073</idno>
					</monogr>
					<idno type="MD5">18BF275BFCAE4DF23515649F8B40E150</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2025-04-23T18:31+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>garbage collector</term>
					<term>memory profiler</term>
					<term>memory management</term>
					<term>virtual machine</term>
					<term>Pharo</term>
					<term>Smalltalk</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Automatic memory management is often supported by Garbage Collectors (GC). GC usually impacts running application performance. For tuning properly, they expose some parameters to support the adaptation of their algorithms to specific applications' scenarios. In some cases, the developers should modify the GC parameter values to achieve high performance.</p><p>However, many application developers cannot be expected to perform expert analysis to determine which parameter values are the best for their application. There are techniques to find "good enough" parameter values. But, even if the overhead was reduced, it is still unknown the cause of the problem and how the GC tuning managed it.</p><p>In this paper, we present a methodology to identify the causes of GC overhead in Pharo applications for tuning GC parameters. We describe the GC inside the PharoVM and its parameters, looking at how their variations change the allocation behaviour. We were able to analyse, identify and understand the GC performance issues present in one real application and suggest specific GC tuning actions. Using the suggested parameter values, we improved its performance by up to 12x and reduced GC overhead by up to 3.8x.</p><p>During the experiments, we also found: 1) a bug in the production PharoVM concerning the tenuring policy, 2) a misconception about one GC parameter even for the VM developers, and 3) some possible improvements for the current GC implementation.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1.">Introduction</head><p>Automatic memory management is often supported by Garbage Collectors (GC) <ref type="bibr" target="#b0">[1,</ref><ref type="bibr" target="#b1">2]</ref>. GC deals with different programs that manipulate different data. This data must be allocated in the memory (heap) and accessible when the application uses it. We refer to the allocation pattern as the ways that applications allocate and use their data.</p><p>There are different GC strategies to decide where to allocate, keep track and, eventually, free the application data <ref type="bibr" target="#b2">[3,</ref><ref type="bibr" target="#b3">4,</ref><ref type="bibr" target="#b4">5]</ref>. Garbage Collectors respond to the allocation pattern of running applications for better performance. So, they implement parametric algorithms to adapt their complex behaviour to each specific application <ref type="bibr" target="#b3">[4,</ref><ref type="bibr" target="#b5">6,</ref><ref type="bibr" target="#b6">7]</ref>.</p><p>There are reports about how garbage collection impacts application performance if not tuned properly <ref type="bibr" target="#b7">[8,</ref><ref type="bibr" target="#b8">9]</ref>. In the PharoVM <ref type="bibr" target="#b9">[10]</ref>, GC parameters start with default values and application developers are able to override them from the image. If the GC parameter values respond to the application allocation pattern wrongly, the GC will increase overhead and the application performance will be degraded (see <ref type="bibr">Section 2)</ref>. In that case, we say that the application presents a pathological allocation pattern (see <ref type="bibr">Section 6)</ref>. Thus, applications exhibiting allocation patterns unexpected by the GC should modify these parameter values to optimise their performance.</p><p>Worst, most application developers do not know how the Pharo GC works or have misconceptions (see <ref type="bibr">Section 4)</ref>. Even for experts, it is hard to identify the issues between GC and the running application. There are techniques to achieve "good enough" performance based on trial and error of GC parameter values <ref type="bibr" target="#b7">[8]</ref>. But, even though the overhead was reduced, the root cause of the issue and how the GC tuning solved it remains unknown in the end <ref type="bibr" target="#b10">[11,</ref><ref type="bibr" target="#b5">6]</ref>.</p><p>To solve this problem, we propose a methodology to identify the causes of pathological allocation patterns in running applications. Using our modified version of the PharoVM, we log data about each GC execution into a file. By analysing the logs, we are able to understand the application's allocation issues and take better decisions about how to improve performance (see <ref type="bibr">Section 3)</ref>.</p><p>We reduced the time spent in GC by a factor of 3x for all benchmarks of the real application studied in this paper. Our results in Section 6.3 show performance improvements in total execution time up to 12.5x.</p><p>The main contributions of this work are:</p><p>• A methodology to identify application pathological allocation patterns and tune GC parameters for avoiding them. • A full description of the impact of Pharo GC parameters on the application allocation behaviour. • We also found a bug in the production PharoVM concerning the tenuring policy, which was fixed and integrated into the next version (see Section 5). We found a performance issue in the Data Frame<ref type="foot" target="#foot_0">1</ref> open source project. A Data Frame is a data structure to manipulate and analyse large amounts of data. This project is used in real applications, for example in AI-related algorithms.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.">Motivation</head><p>We observed that the execution time grows exponentially related to the amount of data loaded into the Data Frame. We make some benchmarks just by loading data from a file into the DataFrame 2 . Table <ref type="table" target="#tab_0">1</ref> shows the relation between the total execution and GC running time on loading data files with different sizes into a Data Frame 3 . For the case of a 3.1 GB data file, the application spends almost 90% of the execution time just garbage collecting. This is a sign of a pathological allocation pattern.</p><p>Knowing the GC overhead is useful to identify possible performance issues related to allocations. However, we need more information about how the Garbage Collector interacts with the application to understand the causes of those problems.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">Solution</head><p>For garbage collecting, the VM analyses the data accessible from some roots and "discards" not accessible data. the GC performs two strategies to analyse if some data is accessible: a Scavenge using a Remembered Set as root, or a FullGC using global fixed roots in the VM. There is a detailed overview of the Pharo Garbage Collector in Section 4.</p><p>We modified the VM's code to collect information each time the Garbage Collection is triggered.</p><p>From Scavenges, we get:</p><p>• Amount of memory used to allocate objects in the Eden (before).</p><p>• Total survivor's memory size (before and after).</p><p>• Number of objects in the Remembered Set (before and after).</p><p>• Amount of tenured data (before and after).</p><p>• Tenured threshold (if objects were tenured in the pass).</p><p>• Executed time.</p><p>And from FullGC:</p><p>• Time spent marking.</p><p>• Time spent sweeping.</p><p>• Time spent compacting.</p><p>• Total executed time.</p><p>Using our version of the PharoVM, we log all listed data into a file. Then, analysing this file, we identify the causes of application pathological allocation patterns and adapt the set of GC 2 Evaluating: DataFrame readFromCsv: pathToFile asFileReference. 3 Data files used are:</p><p>• https://www.kaggle.com/datasets/rahulbanerjee123/aws-product-length?resource=download (529 MB and 1.6 GB)</p><p>• https://www.kaggle.com/datasets/antoninadolgorukova/proteinrna-vs-rna-spearman-correlation-data? select=Prot-RNA_corr_63gr.csv <ref type="bibr">(3.1 GB)</ref> parameters to achieve better performance. Our results show performance improvements in total execution time up to 12.5x for the Data Frame application presented in 2. We reduced the time spent in GC by a factor of 3x for all benchmarks (see Section 6).</p><p>In the next section, we introduce the Pharo Garbage Collector and its parameters. Profile data also help to understand how each parameter affects the application allocations.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.">Background: Pharo Garbage Collector</head><p>The PharoVM<ref type="foot" target="#foot_1">4</ref> has automatic memory management based on a Generational Garbage Collector <ref type="bibr" target="#b11">[12]</ref>. Memory heap is divided into two areas: New Space and Old Space. Each space has a different structure and strategies for allocation and garbage collection. A big picture of this organization is shown in Figure <ref type="figure" target="#fig_0">1</ref>.</p><p>This design is based on the weak generational hypothesis: most of the objects die young <ref type="bibr" target="#b11">[12,</ref><ref type="bibr" target="#b12">13]</ref>. So, this kind of GC allocates newly instantiated objects and old ones in different spaces. The New Space will be garbage collected often by a Scavenger and the Old Space occasionally by a FullGC since it is bigger and more expensive to scan. The New Space is divided into 3 sections: the Eden and two semi-spaces. The amount of memory for each maintains always the same proportion of 5  7 for the Eden and 2 7 for the semispaces. The Eden is the place where new objects are allocated and the two semi-spaces keep the survivors. Big enough objects are created directly in the Old Space. This is referenced by 1 in Figure <ref type="figure" target="#fig_0">1</ref>. When the amount of memory used in the Eden reaches a threshold, a Scavenge pass is automatically scheduled. The Scavenger performs a copy-collection, copying all survivors to one dedicated semi-space. It is referenced by 2 in Figure <ref type="figure" target="#fig_0">1</ref>. All non-copied data will be overridden by new allocations. To know which objects survive, root references should be followed. The roots for the New Space are the references coming from objects in the Old Space. For avoiding to scan all objects in the Old Space looking for roots, there is a Remembered Set with the objects in the Old Space that have any reference to an object in the New Space <ref type="bibr" target="#b11">[12]</ref>. This Remembered Set is updated at each store (write barrier), based on the object-allocated spaces.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.1.">Pharo Generational Collector Structure</head><p>After many passes, the amount of survivor objects could increase and not fit in the survivor's semi-space. Then, some objects are tenured to the Old Space, based on some policy <ref type="bibr" target="#b13">[14]</ref>. This policy could be based on the object's age, memory location or a specific goal as reducing the number of objects in the Remembered Set. In the current implementation, the Scavenger triggers the tenuring objects when survivors in the semi-space fill the 90%, this value is hardcoded in the GC code. Tenured objects are referenced by 3 in Figure <ref type="figure" target="#fig_0">1</ref>.</p><p>The Old Space is the memory region where most objects live, being at least 3 times bigger than the New Space. It is organised in segments and incorporates more segments dynamically to have enough free space for the demanded amount of the objects/memory by the application. On the contrary, if the system detects that much of managed memory is free and not being used, it returns the free segments to the OS. This process is referenced by 4 and 5 in Figure <ref type="figure" target="#fig_0">1</ref>.</p><p>As the Old Space could be very big and expensive to traverse, this space is garbage collected occasionally. The garbage collection in this space is performed by a FullGC. On FullGC, objects in both, New and Old Spaces, are tracked and non-accessible memory is freed.</p><p>The system automatically decides when to run the Scavenge or FullGC passes. A Scavenge pass is triggered when the Eden is almost full, to free memory for new allocations. The reasons for triggering FullGC are mainly because the system does not have enough memory in the Old Space to allocate one object. In this case, GC tries to free the required amount of memory before requesting them to the Operating System. Applications can also execute a FullGC programmatically.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2.">Analysis of GC Parameters</head><p>There are five parameters in the PharoVM to control the GC behaviour: Desired Eden size, Survivors to keep, Full GC ratio, Grow headroom and Shrink threshold. Next, we will explain each and see their impact on allocations.</p><p>Desired Eden size It is the desired memory size for the Eden. This parameter also controls the size of the entire New Space to maintain the proportion of each section. By default, the Eden size is 16MB. A bigger Eden implies that the GC will support more objects between passes. Thus, GC will perform fewer automatic garbage collections. Figure <ref type="figure" target="#fig_1">2</ref> shows the number of garbage collection passes based on Eden size for different applications. The total number of garbage collections (FullGCs and Scavenges) decreases asymptotically while the Eden size grows. The minimum value depends on how many allocations and FullGC are triggered by the application <ref type="bibr" target="#b4">[5]</ref>.</p><p>Counterintuitively, Figure <ref type="figure" target="#fig_1">2</ref> also shows no clear correlation with the Scavenge time, it also depends on the number of survivors and objects in the Remembered Set (see Section 6.2).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Survivors to keep</head><p>This value is an integer with the desired number of survivor objects to keep in the New Space when the Scavenger decides to tenure objects.</p><p>The VM estimates the proportion of objects to keep in the semi-space based on an average object size of 64 bytes. Using the estimated memory size, the GC computes a tenuring threshold inside the survivor's semi-space to decide which objects will be tenured to the Old Space (i.e. the objects before the threshold). By default, only 10% of survivors in the semi-space will be tenured.</p><p>Figure <ref type="figure" target="#fig_2">3</ref> shows how the total amount of data tenured changes with different values of survivor objects to keep for different allocation patterns. The decision about which objects will be tenured has an impact on applications with different object lifetimes. For example, the application at the bottom of Figure <ref type="figure" target="#fig_2">3</ref> presents a critical value where long lifetime objects keep in the New Space and more data is tenured.</p><p>For applications that use enough amount of data for a long time, this threshold does not have a big impact. Most of the objects will be tenured anyway because of the application usage, independently of the tenuring policy. This is the case of the application on top of Figure <ref type="figure" target="#fig_2">3</ref>.</p><p>As this parameter is a raw quantity, we need to consider the survivors' semi-space size. If the number of objects to keep is big enough to consider all survivors, then GC will not tenure objects from the survivors' semi-space. Instead, it will tenure all new incoming survivors from the Eden directly to the Old Space because there is no more space in the semi-space. The last point for each application in Figure <ref type="figure" target="#fig_2">3</ref> represents that scenario. FullGC ratio This ratio is a threshold for triggering a FullGC when the old space grows more than expected. By default, this value is set at 33%. Thus, when the old space grows 1/3 of its space (from the last FullGC) it will perform a FullGC. Increasing this value will reduce the number of FullGCs automatically performed by the VM. This parameter does not modify the behaviour of the Scavenger.</p><p>Figure <ref type="figure" target="#fig_3">4</ref> shows how the number of FullGC decreases by a bigger FullGC ratio value. This effect was only observable in applications with intensive use of memory, i.e. many allocated objects that finish in the old space.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Grow headroom</head><p>The grow headroom is the minimum amount of memory that the GC will order from the OS. It is used when the system detects that there is not sufficient space in the Old Space, so it will be expanded. The value is 16MB by default.</p><p>This parameter is important to avoid requesting many small chunks of memory from the OS. If the Old Space is filled and new small objects need to be allocated there, the space should grow with sufficient memory for many of them for better performance. Thus, the value for this parameter should be relative to the average size of the new allocations for avoiding unnecessaries FullGC. On the other hand, if the requested memory is much bigger than the total of newly allocated objects size, it wastes resources with unused memory.</p><p>To show this effect, we created an artificial tiny benchmark creating 100 objects of 24MB each. We run it with different headroom values, results are in Figure <ref type="figure" target="#fig_4">5</ref>. The first configuration was executed with a headroom of 16MB, less than 24MB, so each object allocation triggered a FullGC. The number of FullGC decreases proportionally to the number of new objects that enter the headroom. In this extreme scenario, the last configuration was 5x faster than the first one.  Shrink threshold This threshold determines the maximum amount of free memory (without objects) in the Old Space that the GC will manage before trying to get it back to the OS. In that case, it will return to the OS all chunks of free memory until the amount of free memory is close to the Grow headroom, introduced before. By default, the value of this parameter is 32MB.</p><p>In our experiments, we did not see any observable effect based on this parameter, maybe because we did not find the best application allocation pattern for it. We may need more integral profiling techniques for the analysis of this parameter.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.">Bug in the Scanvenge's tenuring policy</head><p>We observed a bug in the tenuring objects policy during the profiling sessions. The tenuring threshold value was computed outside the current survivors' semi-space for all cases where the GC should tenure objects from the New to the Old Space. It makes no sense since this threshold should divide the survivor objects that will and will not be tenured, so it will be at some part inside the current survivors' semi-space.</p><p>Checking the code, we found that the threshold was mistakenly computed in the wrong semi-space. So, any time that the scavenger wants to tenure objects, it was tenuring either none or all survivors, depending on the position of the semi-spaces in the memory.</p><p>We fixed it to compute the value in the correct semi-space. Figure <ref type="figure" target="#fig_5">6</ref> shows the amount of data that survives in the semi-space on each Scavenge before and after the fix respectively. Marked dots represent the value of the tenuring thresholds. The horizontal dotted line is the limit of the semi-space. Black lines are the survivor data amount in the semi-space, dots represent the tenuring threshold when the Scavenger decides to tenure (pointed by arrows and circles) and the red horizontal dotted line is the limit of the semi-space. At the left, the threshold is set outside the current semi-space, so all objects are tenured. At the right, the threshold is computing in the correct place, only 128KB of objects are tenured in each Scavenge.</p><p>Before the fix, the threshold is outside the semi-space and all survivors are tenured. After the fix, more scavenges perform tenuring but much less amount of data is tenured on each. Summarising them, the total amount of tenured data in this example decreases from 4 to 2.5 MB.</p><p>For the rest of the analysis in this paper, we will use the fixed version of the VM. This fix is already integrated into the PharoVM and will be present in the next release.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.">Case study: pathological allocation patterns</head><p>In this section, we will show the analysis of the pathological allocation patterns discovered for the Data Frame application presented in Section 2 based on the profile data collected by our instrumented GC. Our methodology is based on identifying what are the causes of performance issues and suggesting some changes in the GC parameters values for solving them. Then we rerun the benchmarks with the suggested changes to see if the observed problems were solved.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.1.">Reducing the number of FullGC passes</head><p>Looking at the profile data, the first thing that called our attention was the number of FullGC triggered together. Performing many FullGC together increases overhead because scanning all the Old Space is an expensive task. It is better to wait for some Scavenges before, so the application has more time to use the objects and then the GC has more chances to free their memory. Figure <ref type="figure" target="#fig_6">7</ref> shows the relation between Scavenges and FullGC. Analysing the first chart in Figure <ref type="figure" target="#fig_6">7</ref> we observed two patterns of FullGC: during data loading (before point P), FullGC are triggered periodically in time; and during Data Frame building (after point P), FullGC are triggered together.</p><p>The first group is due to the loaded data being tenured to the Old Space, growing it and triggering the FullGC ratio, as we introduced in Section 4.2. In this case, the application is loading a lot of non-temporary data, so the FullGC will not free memory. We should adapt the FullGC ratio relative to the amount of loaded data to avoid most of them.</p><p>The number of FullGC triggered together is due to the size of the Data Frame structures. They are big enough for being allocated directly in the Old Space. If the Old Space does not have enough free memory, FullGC is triggered as explained in Section 4.2. To avoid this anomaly, we need to set a Grow Headroom according to the expected Data Frame size.</p><p>So, we customised the FullGC ratio to a very big value, simulating an infinite ratio, and the Grow headroom to the same as the loaded file, depending on the benchmark. We ran the benchmarks again to compare performance and continue the analysis. These GC parameter values reduced the number of FullGC from 36 to only 1 time and increased the application performance between 1% and 5%.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.2.">Reducing Scavenge time</head><p>Analysing the newly profiled data, we saw a big increase in the time of Scavenges when the Data Frame is being built. Scavenges are 52x slower now! This increment in Scavenge time starts when the Data Frame is created and persists until the end of the benchmark, as we can observe in Figure <ref type="figure" target="#fig_7">8</ref>, representing 25% of the running application time. This pathological scenario is due to a big object inside the Remembered Set, probably the Data Frame structure. To know which objects survive in each scavenge, all references from every object in the Remembered Set should be scanned. If an object with so many references arrives in the Remember Set, it could take a long time to scan it. Looking at the number of objects in the Remembered Set in each scavenge, we know that only one (or a very small group of objects) are the cause of this behaviour.</p><p>We should avoid spending so much time scanning objects on each Scavenge because it is very frequent. But, as there is no way to control the objects in the Remembered Set, it is not an easy task. We tried with different values for the tenuring threshold introduced in Section 4.2 to control which survivor objects in the New Space are tenured to the Old Space. None of the possible values could avoid this situation, since the pointed new objects are continually created and the big object always stays in the Remembered Set.</p><p>The solution that we found for this issue was to configure the tenuring threshold value to keep all survivors in the semi-space. Then, after the survivor's semi-space fills up, all new survivor objects will be automatically tenured from the Eden. Using this strategy, all survivor objects created at the end of the benchmark will live together in the Old Space. Thus, we avoid having big objects in the Remembered Set for almost all Scavenges.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.3.">Final configuration and Results</head><p>Given the previous observations, we tuned GC parameters to:</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>1) Have an infinite FullGC ratio</head><p>To reduce the number of FullGC when the Old Space grows.</p><p>2) Have a grow headroom equal to the loaded file To avoid many FullGC together.</p><p>3) Keep all survivors in the semi-space To tenure new objects to the Old Space quickly. We improved the time spent in GC for the Data Frame application benchmarks presented in Section 2 by a factor bigger than 3x, as we show in Table <ref type="table" target="#tab_1">2</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.4.">Take aways</head><p>Learnings about this experience are:</p><p>• It is possible to tune the GC parameters for a specific application based on the methodology presented in this paper. • Using profile techniques on running applications we were able to identify pathological allocation patterns. • We understood how variations in the GC parameters are related to the application pattern allocations. It is important to have a good overview of the GC algorithm to understand what the effect of changing each parameter is. • Mixing the items above, we have a set of tools to analyse the interactions between applications and VM garbage collection. We are able to make better decisions about tuning applications for performance improvements.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7.">Related work</head><p>The work presented in this paper is a continuation of previous work <ref type="bibr" target="#b14">[15]</ref>. Even if we did not use Vicoca, the tool presented in that paper, we reuse part of the infrastructure developed on top of the Pharo VM. While previous work aims to identify Code Cache issues, in this work we use profiling via GC events to identify allocation issues. Both approaches are similar: profiling VM events to analyse specific applications' behaviour and, eventually, tune VM parameters to achieve better performance. Kaleba et al., <ref type="bibr" target="#b15">[16]</ref> have extended an existing VMProfiler for the same VM as us. They were interested in profiling the generated machine code to improve the JIT compiler, different to our goal of GC tuning for applications.</p><p>There are many works exploring techniques to find an optimal set of GC parameter values for a specific application <ref type="bibr" target="#b7">[8,</ref><ref type="bibr" target="#b8">9,</ref><ref type="bibr" target="#b16">17]</ref>. They present the problem of having too many parameters for tuning, so they use machine learning and hill-climber algorithms to find good values. Our approach is based on analysis and understanding the application allocation patterns for consciously tuning GC parameters. They also agree about the importance of tuning GC parameters to improve applications' performance.</p><p>The master thesis of Neu is the most similar to our work <ref type="bibr" target="#b6">[7]</ref>. He describes the parameters in the OpenJ9 Java VM showing the impact of each on applications performance, similar to us. His work also uses profile techniques to log VM information and a tool to analyse it later, such as ours. Both approaches intend to help users to get information about their running applications' behaviour and be able to manually tune GC parameters.</p><p>VM profiling techniques are commonly used in auto-tuning research <ref type="bibr" target="#b5">[6,</ref><ref type="bibr" target="#b10">11]</ref>. We agree about the difficulty of tuning GC parameters for user developers. To solve this problem, they propose a VM implementation which tunes itself online to improve the predictions about application behaviour. Instead, we prefer to build tools that users can use to learn about its applications and take the decision about the best way to improve its performance.</p><p>Finally, Ungar and Jackson already suggest a low effectiveness of a "simple two-generation scavenger" in programs that hang onto large amounts of temporary data for extended periods of time [? ]. This is exactly the main cause of our pathological case study. Next years after that, some researchers proposed solutions to this problem thru pretenuring <ref type="bibr" target="#b17">[18,</ref><ref type="bibr" target="#b18">19,</ref><ref type="bibr" target="#b19">20,</ref><ref type="bibr" target="#b20">21]</ref>. They use profiling techniques and sampling to predict allocations of objects with long lifetimes.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8.">Future work 8.1. Available for the community</head><p>Our next goal is that Pharo developers can profile the Garbage Collector on their applications and adapt its parameters if needed. For that, we need to integrate the work done in the PharoVM to be able to profile Garbage Collection passes and an API for users <ref type="foot" target="#foot_2">5</ref> . We also want to publish an application with tools for analysing and visualising the profiled data <ref type="bibr" target="#b21">[22]</ref>. Using that tool and the methodology presented in this paper, developers will be able to adapt the Garbage Collector behaviour to their applications' specific allocation patterns.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8.2.">Change GC parameters</head><p>We also have two suggestions to improve the API for the current GC parameters:</p><p>1. Change the Survivors to keep parameter for a Tenuring proportion. This parameter confuses even for VM developers, we saw erroneous comments in the GC code. The new suggested parameter will directly represent the percentage of survivor data to tenure when New Space is full.</p><p>2. Add a new parameter to manage the Tenuring criterion. Now the Scavenge have different criteria for tenuring objects. In this paper, we just presented the tenuring by age, because is the normal criterion. Using this parameter, we could set a criterion for reducing the Remembered Set, for example.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8.3.">Improve GC in PharoVM</head><p>We are also excited to improve the Pharo Garbage Collector implementation to automatically avoid some of the pathological scenarios seen in Section 6.</p><p>First, we want to avoid big objects in the Remembered Set. Since the design of a Generation Garbage Collector is based on fast Scavenges, avoiding scanning big objects on each pass could improve its performance.</p><p>Another idea is to have a pretenuring strategy for long-life objects. We have an idea to identify these objects based on the allocation site (the method where the object is instantiated).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8.4.">Continue profiling</head><p>Continuing this work, we want to increase the data collected by the profiling sessions to be able to make better analyses. During the experiments, some data about FullGC was missing for a better understanding of the passes. Cause of the pass, survived data size, free chucks, and segments information are some examples. With more information, we will be able to understand the application allocation patterns better and, for example, find better examples for each GC parameter change.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="9.">Conclusions</head><p>In this paper, we presented a methodology to identify the causes of performance issues with the Pharo Garbage Collector (GC) for running applications. It is based on profile data collected each time that the GC is executed. Using the profile data, we described the GC used by the PharoVM and its parameters. We showed how each parameter affects the underlined behaviour of the GC.</p><p>We introduced a real application scenario presenting performance issues with the GC. Then, we were able to identify the causes of these pathological allocation patterns. Using our methodology, we were able to tune the GC parameter values for the specific application allocation pattern. Our results showed performance improvements up to 12.5x in execution time and reduced the GC overhead by up to 3.8x, for the analysed benchmark.</p><p>This work highlights the importance of tuning GC parameters for specific application behaviour. Our descriptions of the GC and its parameters, the profiling tools and the presented methodology are useful to help developers with this task.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Figure 1 :</head><label>1</label><figDesc>Figure 1: Overview of the memory heap structure by the Generational Garbage Collector. There are two sections: New Space and Old Space. We zoomed the New Space to show inner divisions. Blue arrows show the data allocation flow. Red letters and arrows are for references in the paper.</figDesc><graphic coords="4,134.65,351.19,325.98,230.96" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Figure 2 :</head><label>2</label><figDesc>Figure 2: Garbage Collector behaviour based on Eden size for different applications. On the left, the number of garbage collection passes decreases asymptotically while the Eden size is bigger. On the right, the amount of time Scavenging is not fully dependent on the Eden size.</figDesc><graphic coords="6,99.21,84.19,396.85,142.76" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Figure 3 :</head><label>3</label><figDesc>Figure 3: Total amount of tenured data based on the number of survivor objects to keep in the New Space. Points at the end represent the case where all survivors in the semi-space are kept and only new survivors from the Eden are tenured.</figDesc><graphic coords="7,127.56,84.19,340.15,176.38" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Figure 4 :</head><label>4</label><figDesc>Figure 4: Number of FullGC based on Full GC ratio. Higher ratios imply fewer FullGCs automatically triggered.</figDesc><graphic coords="8,155.91,84.19,283.47,200.27" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Figure 5 :</head><label>5</label><figDesc>Figure 5: Number of Full GC for different Grow headroom values. The number of Full GC is proportional to the number of new objects that fit the headroom.</figDesc><graphic coords="8,113.39,329.85,368.50,177.13" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Figure 6 :</head><label>6</label><figDesc>Figure 6: Bug on computing the tenuring threshold in Scavenger.Black lines are the survivor data amount in the semi-space, dots represent the tenuring threshold when the Scavenger decides to tenure (pointed by arrows and circles) and the red horizontal dotted line is the limit of the semi-space. At the left, the threshold is set outside the current semi-space, so all objects are tenured. At the right, the threshold is computing in the correct place, only 128KB of objects are tenured in each Scavenge.</figDesc><graphic coords="9,99.21,283.03,396.84,199.00" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>Figure 7 :</head><label>7</label><figDesc>Figure 7: Relation between Scavenges and FullGC in Data Frame benchmarks. In red, the number of FullGC triggered together. In blue, point P is used as a reference between the two different patterns. After the fix, only one FullGC is performed</figDesc><graphic coords="10,113.39,292.11,368.49,188.58" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_7"><head>Figure 8 :</head><label>8</label><figDesc>Figure 8: Time of each Scavenge in Data Frame benchmarks. After the red mark, all Scavenge passes at the end have increased their time by more than 52x. After the fix, only one Scavenge has this overhead.</figDesc><graphic coords="11,113.39,267.80,368.50,189.09" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_0"><head>Table 1</head><label>1</label><figDesc>Benchmarks for Data Frame application on load data files with different sizes. Garbage collection time increases exponentially related to the loaded data.</figDesc><table><row><cell cols="4">Data size Total time (sec) GC time (sec) GC overhead</cell></row><row><cell>529 MB</cell><cell>43</cell><cell>7</cell><cell>16%</cell></row><row><cell>1.6 GB</cell><cell>150</cell><cell>38</cell><cell>25%</cell></row><row><cell>3.1 GB</cell><cell>5599</cell><cell>5158</cell><cell>92%</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_1"><head>Table 2</head><label>2</label><figDesc>Results of tuning GC parameters for Data Frame application benchmarks. We fixed the pathological allocation patterns to avoid GC overhead. Parenthesis values show performance improvement.</figDesc><table><row><cell>Data size</cell><cell cols="2">Total secs GC overhead before before</cell><cell cols="2">Total secs GC overhead after after</cell></row><row><cell>529 MB</cell><cell>43</cell><cell>16%</cell><cell>37 (1.1x)</cell><cell>5% (3.2x)</cell></row><row><cell>1.6 GB</cell><cell>150</cell><cell>25%</cell><cell>122 (1.2x)</cell><cell>7% (3.6x)</cell></row><row><cell>3.1 GB</cell><cell>5599</cell><cell>92%</cell><cell>440 (12.5x)</cell><cell>24% (3.8x)</cell></row></table></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">https://github.com/PolyMathOrg/DataFrame</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="4" xml:id="foot_1">https://github.com/pharo-project/pharo-vm</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="5" xml:id="foot_2">https://github.com/pharo-project/pharo-vm/pull/606</note>
		</body>
		<back>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">An efficient, incremental garbage collector</title>
		<author>
			<persName><forename type="first">L</forename><forename type="middle">P</forename><surname>Deutsch</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">G</forename><surname>Bobrow</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">CACM</title>
		<imprint>
			<biblScope unit="volume">19</biblScope>
			<biblScope unit="page" from="522" to="526" />
			<date type="published" when="1976">1976</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<monogr>
		<title level="m" type="main">The garbage collection handbook: the art of automatic memory management</title>
		<author>
			<persName><forename type="first">R</forename><surname>Jones</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Hosking</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Moss</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2016">2016</date>
			<publisher>CRC Press</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<author>
			<persName><forename type="first">R</forename><surname>Garner</surname></persName>
		</author>
		<title level="m">The design and construction of high performance garbage collectors</title>
				<imprint>
			<date type="published" when="2011">2011</date>
		</imprint>
		<respStmt>
			<orgName>The Australian National University</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">Ph.D. thesis</note>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Oil and water? high performance garbage collection in java with mmtk</title>
		<author>
			<persName><forename type="first">S</forename><forename type="middle">M</forename><surname>Blackburn</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Cheng</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><forename type="middle">S</forename><surname>Mckinley</surname></persName>
		</author>
		<idno type="DOI">10.1109/ICSE.2004.1317436</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings. 26th International Conference on Software Engineering</title>
				<meeting>26th International Conference on Software Engineering</meeting>
		<imprint>
			<date type="published" when="2004">2004</date>
			<biblScope unit="page" from="137" to="146" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Quantifying the performance of garbage collection vs. explicit memory management</title>
		<author>
			<persName><forename type="first">M</forename><surname>Hertz</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><forename type="middle">D</forename><surname>Berger</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 20th annual ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications</title>
				<meeting>the 20th annual ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications</meeting>
		<imprint>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="313" to="326" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Auto-tuning the java virtual machine</title>
		<author>
			<persName><forename type="first">S</forename><surname>Jayasena</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Fernando</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Rusira</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Perera</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Philips</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">IEEE International Parallel and Distributed Processing Symposium Workshop</title>
				<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2015">2015. 2015</date>
			<biblScope unit="page" from="1261" to="1270" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<monogr>
		<author>
			<persName><forename type="first">N</forename><surname>Neu</surname></persName>
		</author>
		<title level="m">Automatic application performance improvements through VM parameter modification after runtime behavior analysis</title>
				<imprint>
			<date type="published" when="2014">2014</date>
		</imprint>
		<respStmt>
			<orgName>University of New Brunswick</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">Ph.D. thesis</note>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">The taming of the shrew: Increasing performance by automatic parameter tuning for java garbage collectors</title>
		<author>
			<persName><forename type="first">P</forename><surname>Lengauer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Mössenböck</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 5th ACM/SPEC international conference on Performance engineering</title>
				<meeting>the 5th ACM/SPEC international conference on Performance engineering</meeting>
		<imprint>
			<date type="published" when="2014">2014</date>
			<biblScope unit="page" from="111" to="122" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Predicting jvm parameters for performance tuning using different regression algorithms</title>
		<author>
			<persName><forename type="first">G</forename><surname>Vijayakumar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Bharathi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Fourth International Conference on Emerging Research in Electronics, Computer Science and Technology (ICERECT)</title>
				<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2022">2022. 2022</date>
			<biblScope unit="page" from="1" to="8" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">The cog smalltalk virtual machine</title>
		<author>
			<persName><forename type="first">E</forename><surname>Miranda</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of VMIL 2011</title>
				<meeting>VMIL 2011</meeting>
		<imprint>
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">Garbage collection auto-tuning for java mapreduce on multi-cores</title>
		<author>
			<persName><forename type="first">J</forename><surname>Singer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Kovoor</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Brown</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Luján</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ACM SIGPLAN Notices</title>
		<imprint>
			<biblScope unit="volume">46</biblScope>
			<biblScope unit="page" from="109" to="118" />
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">Generation scavenging: A non-disruptive high performance storage reclamation algorithm</title>
		<author>
			<persName><forename type="first">D</forename><surname>Ungar</surname></persName>
		</author>
		<idno type="DOI">10.1145/390011.808261</idno>
	</analytic>
	<monogr>
		<title level="j">ACM SIGPLAN Notices</title>
		<imprint>
			<biblScope unit="volume">19</biblScope>
			<biblScope unit="page" from="157" to="167" />
			<date type="published" when="1984">1984</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<monogr>
		<title level="m" type="main">A Real Time Garbage Collector Based on the Lifetimes of Objects</title>
		<author>
			<persName><forename type="first">H</forename><surname>Lieberman</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Hewitt</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1981">1981</date>
			<publisher>MIT</publisher>
			<biblScope unit="volume">569</biblScope>
		</imprint>
	</monogr>
	<note type="report_type">AI memo</note>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">Tenuring policies for generation-based storage reclamation</title>
		<author>
			<persName><forename type="first">D</forename><surname>Ungar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Jackson</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings OOPSLA &apos;88</title>
				<meeting>OOPSLA &apos;88</meeting>
		<imprint>
			<date type="published" when="1988">1988</date>
			<biblScope unit="volume">23</biblScope>
			<biblScope unit="page" from="1" to="17" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">Profiling Code Cache Behaviour via Events</title>
		<author>
			<persName><forename type="first">P</forename><surname>Tesone</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Polito</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Ducasse</surname></persName>
		</author>
		<idno type="DOI">10.1145/3475738.3480720</idno>
		<ptr target="https://hal.inria.fr/hal-03332040.doi:10.1145/3475738.3480720" />
	</analytic>
	<monogr>
		<title level="m">MPLR &apos;21</title>
				<meeting><address><addrLine>Münster, Germany</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2021">2021</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">A detailed vm profiler for the cog vm</title>
		<author>
			<persName><forename type="first">S</forename><surname>Kaleba</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Béra</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Bergel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Ducasse</surname></persName>
		</author>
		<ptr target="https://hal.inria.fr/hal-01585754" />
	</analytic>
	<monogr>
		<title level="m">International Workshop on Smalltalk Technology IWST&apos;17</title>
				<meeting><address><addrLine>Maribor, Slovenia</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2017">2017</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">Intelligent selection of application-specific garbage collectors</title>
		<author>
			<persName><forename type="first">J</forename><surname>Singer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Brown</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>Watson</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Cavazos</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 6th international symposium on Memory management</title>
				<meeting>the 6th international symposium on Memory management</meeting>
		<imprint>
			<date type="published" when="2007">2007</date>
			<biblScope unit="page" from="91" to="102" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Generational stack collection and profile-driven pretenuring</title>
		<author>
			<persName><forename type="first">P</forename><surname>Cheng</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Harper</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Lee</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the ACM SIGPLAN 1998 conference on Programming language design and implementation</title>
				<meeting>the ACM SIGPLAN 1998 conference on Programming language design and implementation</meeting>
		<imprint>
			<date type="published" when="1998">1998</date>
			<biblScope unit="page" from="162" to="173" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b18">
	<analytic>
		<title level="a" type="main">Dynamic adaptive pre-tenuring</title>
		<author>
			<persName><forename type="first">T</forename><forename type="middle">L</forename><surname>Harris</surname></persName>
		</author>
		<idno type="DOI">10.1145/362422.362476</idno>
		<idno>doi:10. 1145/362422.362476</idno>
		<ptr target="https://doi.org/10.1145/362422.362476" />
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2nd International Symposium on Memory Management, ISMM &apos;00</title>
				<meeting>the 2nd International Symposium on Memory Management, ISMM &apos;00<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>Association for Computing Machinery</publisher>
			<date type="published" when="2000">2000</date>
			<biblScope unit="page" from="127" to="136" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b19">
	<analytic>
		<title level="a" type="main">Dynamic object sampling for pretenuring</title>
		<author>
			<persName><forename type="first">M</forename><surname>Jump</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><forename type="middle">M</forename><surname>Blackburn</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><forename type="middle">S</forename><surname>Mckinley</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 4th international symposium on Memory management</title>
				<meeting>the 4th international symposium on Memory management</meeting>
		<imprint>
			<date type="published" when="2004">2004</date>
			<biblScope unit="page" from="152" to="162" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b20">
	<analytic>
		<title level="a" type="main">Garbage collection hints</title>
		<author>
			<persName><forename type="first">D</forename><surname>Buytaert</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Venstermans</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Eeckhout</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><forename type="middle">De</forename><surname>Bosschere</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">High Performance Embedded Architectures and Compilers: First International Conference, HiPEAC 2005</title>
				<meeting><address><addrLine>Barcelona, Spain</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2005">November 17-18, 2005. 2005</date>
			<biblScope unit="page" from="233" to="248" />
		</imprint>
	</monogr>
	<note>Proceedings 1</note>
</biblStruct>

<biblStruct xml:id="b21">
	<analytic>
		<title level="a" type="main">Agile visualization with Roassal</title>
		<author>
			<persName><forename type="first">V</forename><forename type="middle">P</forename><surname>Araya</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Bergel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Cassou</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Ducasse</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Deep Into Pharo</title>
				<imprint>
			<publisher>Square Bracket Associates</publisher>
			<date type="published" when="2013">2013</date>
			<biblScope unit="page" from="209" to="239" />
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
