SlideShare a Scribd company logo
A Tour to Spur for
Non-VM Experts
Guille Polito, Christophe Demarey
ESUG 2016, 22/08, Praha
From a user point of view
We are working on the new Pharo Kernel
● Bootstrap: create an image from scratch
- Classes
- Global objects
- Processes and contexts
● Image Initialization: What is the correct order?
BTW, see our talk on this ;)
Mission Pharo Kernel, Thursday 10 am
What is this talk about?
Dec 14, 2015; 11:08am
[IMPORTANT] Starting migration to Spur
VM
Initial Motivation to look into Spur
1) How do we move to Spur
as fast as possible?
2) Should we /
How do we adapt to it?
3) What are the risks?
Motivation of this talk #1: Education
Explain what is Spur
Determine if a problem comes
from image side or VM side?
Motivation of this talk #2:
Understanding the Impact
Is my application compatible?
Will It break? Do I have to port it?
Part 1:
Demolishing Myths
What is Spur?
Spur is not a new Virtual Machine
Its underlying execution engine is the same as in Cog
(same bytecode, same interpreter, same JIT compiler)
Spur is not a new Garbage Collector
It just implements a new garbage collector
(which, BTW, is not new...)
Spur is not a new Object Format.
It just implements a new object format
(which, BTW, is just the means to an end)
So... what is Spur?
Spur is a new Memory Manager for Cog VM.
- New object representation in memory
(that allows ephemerons, pinned objects,...)
- New memory organization of Pharo images
(that allows to better manage resources)
A tour on Spur for non-VM experts
Spur in a Nutshell
It's a Cog VM
+ 64 bits support
+ faster: x1.8 speedup
+ larger images (> 2 Go)
+ ephemeron support
and more ...
Spur > 64-bits support
● No more need to install 32-bits libraries
● Images with size > 2 Go
Spur > faster access to classes
Class Table
● Direct access to
class objects
0
1
2
3
4
5
6
7
8
Array (hash=0)
String (hash=6)
Next page...
Spur > faster
Garbage Collector
● “Young objects die young (and fast)”
● Added survivor segments (future and past) to
the young space
=> allows more minor GC instead of major GC
future
Old space Young Space
past
eden
Major GC (mark & sweep)
Minor GC
(scavenger)
Spur > Fast become
No more hangs in large images when using #become:
(e.g. Moose with a big famix model)
Why? Spur introduces forwarders
● prevents to scan the whole memory
● replaces pointers when they are accessed
● implemented by a partial read barrier1
Cheap in most cases (just one indirection)
Costly if you rely a lot on primitives fallback
1. Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient Support
of Live Object-Oriented Programming. ISMM'15
Spur > faster
Immediate objects
New immediate objects
● Character
● Float (only 64-bits)
Speed-up in wide strings
Speed-up in float arithmetic and memory saving
Spur > other features
Spur object format:
● All classes are compact
=> only two kind of headers (3 before Spur)
● Support for pinned-objects (see UFFI talk on Friday)
● Ongoing support of read-only objects
● Still 2 unused bits
Spur > scalability
● Memory is now divided in several segments
● No more need to have a contiguous chunk of
memory
Memory
segment
Memory
segment
Memory
segment
Memory
segment
Spur > reliability
● Ephemeron finalization support
● Avoid memory leaks
BTW, see our OTHER talk on this ;)
A Weak Pharo story, Thursday, 3 pm
Part 2:
Porting applications and
frameworks to Spur
Cog
Spur
How do I port
my application
to Spur?
Porting Applications
Porting Applications
Porting Applications
Porting Applications
Okay, maybe just wait that your developer friends
port your favorite frameworks.
Porting Frameworks/Libraries
Porting Basics #1
The number hierarchy changed
● Beware if you have visitors
● Beware if you have overrides
Porting Frameworks/Libraries
Porting Basics #2
Character is now immediate
● Beware if you have overrides that use the
internal state
Porting Frameworks/Libraries
Porting Basics #3
New (enhanced) ephemeron finalization
● If you need finalization you'll probably want to
use the new one
BTW, see our OTHER talk on this ;)
Porting Frameworks/Libraries
A Weak Pharo story, Thursday, 3 pm
Porting Basics #4
Native Boost is being deprecated
● If you are using FFI, you will need to review your
bindings
Porting Frameworks/Libraries
Native Boost UFFI
Spur Behind the Scenes
VM development hosted on GitHub:
OpenSmalltalk / opensmalltalk-vm
Why is it a good news?
● Brings together the VM community
● Easier to contribute
– Pull requests
– Issue tracker
– Documentation:
https://github.com/OpenSmalltalk/opensmalltalk-
vm/blob/Cog/CONTRIBUTING.md
VM build all flavors through
Travis CI
Still missing VM tests. Upcoming?
Where to find VM binaries?
● Pharo
http://files.pharo.org/vm/
Squeak, NewSpeak
https://bintray.com/opensmalltalk/vm/cog
Conclusion
Should I move to Spur?
Bounce
BubbleSort
DeltaBlue
Fannkuch
GraphSearch
Json
Mandelbrot
Nbody
PageRank
Permute
Queens
QuickSort
Sieve
Storage
Towers
0
0,2
0,4
0,6
0,8
1
1,2
1,4
1,6
1,8
Pre-Spur
Spur
by Stefan Marr, Apr 06, 2015
Should I move to Spur?
✔ 64-bits support
✔ Increased performances: x1.8 speedup
✔ Scalability, Reliability and open to new
features
– image not compacting anymore (will be fixed soon)
EXTRA SLIDES!
1) Class tables
2) Forwarders
3) Ephemeron Finalization
4) The Scavenger GC
Dissecting Spur...
Chapter 1
Classes are in Tables
(and they hide in tables)
1.1 The old object header...
1.1 Compact classes
Smalltalk compactClassesArray
1.1 Cons of the old object header
● A full word is used to indicate an object's class
– 4G classes in 32 bits
– 16E (2^60) classes in 64 bits (!!)
● Three different headers
=> checks for the header type are common
1.2 New class header
1.2 Class table
0
1
2
3
4
5
6
7
8
Array (hash=0)
String (hash=6)
Next page...
1.2 Class table
class idx = 0
0
1
2
3
4
5
6
7
8
Array (hash=0)
String (hash=6)
Next page...
1.2 Pros of the new object header
● 2^22 classes (4M). Still enough and efficient.
● Compatible with 64bits
● All classes are compact => only two kind of headers
1.2 Hidden objects
0
1
2
3
4
5
6
7
8
Array (hash=0)
String (hash=6)
Next page...
Class idx = 1
1.2 Hidden objects?
● The class table is an object (and lives in the heap)
● Its class index is “hidden”:
– Array allInstances
will iterate objects by class index
● In the class table:
– Indexes 0-15 are reserved for tagged objects
– Indexes 16-32 are reserved for hidden classes
1.3 Maintaining the class table
Classes are normal objects...
They are created with no special primitives...
But...
How does the VM know an object is a
class to put it into the class table?
1.3 Identifying classes by definition
A class is an object that is instantiated:
A class enters the class table
upon instantiation
1.3 But the index is the hash!
But... hashes are assigned lazily for all objects:
Classes, on instance-side,
define a special hash method
Behavior >> basicIdentityHash
<primitive: 175>
self primitiveFailed
Object >> basicIdentityHash
<primitive: 75>
self primitiveFailed
Chapter 1 - Conclusions
● Classes are organized in tables
● All classes are compact
● Simpler object header
● Still place for 4M classes
● On the image side, is almost transparent
Chapter 2
The forwarder plague
2.1 Become
● Swaps two objects
– (actually, swaps two object's identity)
● Useful for:
– Updating and migrating objects
– Install proxies
– Replace an object's behavior
2.1 The old become
● Full scanned all memory
● And was SLOOOOOW
2.1 Lazy become
ba
Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient
Support of Live Object-Oriented Programming. ISMM'15
2.1 Lazy become
b becomeForward: a.
User's code
Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient
Support of Live Object-Oriented Programming. ISMM'15
ba
2.1 Lazy become
Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient
Support of Live Object-Oriented Programming. ISMM'15
b becomeForward: a.
User's code
a forwarder!
2.1 Lazy Become
Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient
Support of Live Object-Oriented Programming. ISMM'15
b becomeForward: a.
b doSomething
User's code
a forwarder!
2.2 The read barrier
● A full read barrier would be too expensive
– (on every read, on every primitive, on every
message send...)
● The read barrier is implemented in two places:
– Message send lookup failure
– Primitive failure
Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient
Support of Live Object-Oriented Programming. ISMM'15
2.2 Message send lookup failure
method := (self lookupSelector: selector inClass: class).
method ifNil: [
(receiver isForwarder) ifTrue: [
receiver := receiver forward.
“scan also the objects in the stack” ].
method := (self lookupSelector: selector inClass: class).
].
Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient
Support of Live Object-Oriented Programming. ISMM'15
2.2 Primitive failure
self performPrimitive: primitiveNumber.
self primitiveFailed ifTrue: [
“scan the stack looking for forwarders and retry”
self performPrimitive: primitiveNumber.
].
Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient
Support of Live Object-Oriented Programming. ISMM'15
2 Conclusions
● Become does not need full scan anymore
● A forwarder replaces the object in place
● Two-way become copies object at the end
● Forwarders are bypassed using a partial read barrier:
– Message lookup failure
– Primitive failure
● No noticeable overhead
3.5 Scavenger GC
● “Young Objects Die Young (and quick)”
● Young objects are created in eden
● Objects are “tenured” after surviving several
generations
● Tenured objects go to old space
3.5 Scavenger GC
Old space New Space
future past
eden
3.5 Scavenger GC
Old space New Space
future past
eden
● Mark and Sweep (marking collector)
● Runs “every blue moon” on the entire memory
● Slow
● Scavenger (copying collector)
● Runs often, only in new space
● Object tenure (to old space)
depends on the ratio of
allocation
3.5 Scavenger GC
New Space
future past eden
1) Future is always empty during execution
3.5 Scavenger GC
New Space
future past eden
1) Future is always empty during execution
2) On a GC, past and eden objects that are referenced are copied to future
3.5 Scavenger GC
New Space
past future eden
1) Future is always empty during execution
2) On a GC, past and eden objects that are referenced are copied to future
3) Then, future and past spaces are swapped
3.5 Scavenger GC
Two questions remain:
● How does the scavenger do a GC without
iterating the entire heap?
● How does he know object ages?
3.5 Scavenger GC
Two questions remain:
● How does the scavenger do a GC without
iterating the entire heap?
● How does he know object ages?
It maintains a set of “objects in new space referenced from old space”
By their addresses! Lower addresses are younger....
Is that all?
● Pinned objects?
● The finalization queue?
● Memory segments, bridges, …?
● (The not working) Memory compaction?
● New immediate objects?
● ...

More Related Content

PDF
A peek into Python's Metaclass and Bytecode from a Smalltalk User
KEY
Modern Java Concurrency
PDF
Working With Concurrency In Java 8
PPTX
JAVA CLASS1
KEY
Programming with Python: Week 1
PDF
Concurrency
KEY
Java Closures
KEY
Perl On The JVM (London.pm Talk 2009-04)
A peek into Python's Metaclass and Bytecode from a Smalltalk User
Modern Java Concurrency
Working With Concurrency In Java 8
JAVA CLASS1
Programming with Python: Week 1
Concurrency
Java Closures
Perl On The JVM (London.pm Talk 2009-04)

What's hot (20)

PPTX
Multithreading Design Patterns
PPTX
Exploring .NET memory management - JetBrains webinar
PPT
Cetis Talk 27 Jan2009
PDF
C++ Actor Model - You’ve Got Mail ...
PDF
Intro to Python Workshop San Diego, CA (January 19, 2013)
PDF
Python 3.5: An agile, general-purpose development language.
PDF
Java Threads
PPTX
Multithreading in java
PDF
Concurrency
PPTX
Best Python Online Training with Live Project by Expert
PPTX
Multithreading programming in java
PDF
NDK Primer (AnDevCon Boston 2014)
PDF
Beginning Python
ODP
Introduction to programming with python
PDF
Introduction to concurrent programming with Akka actors
PPTX
Multithreading in java
PDF
WeakReferences (java.lang.ref and more)
PDF
Intro to Objective C
PPTX
The Java Memory Model
Multithreading Design Patterns
Exploring .NET memory management - JetBrains webinar
Cetis Talk 27 Jan2009
C++ Actor Model - You’ve Got Mail ...
Intro to Python Workshop San Diego, CA (January 19, 2013)
Python 3.5: An agile, general-purpose development language.
Java Threads
Multithreading in java
Concurrency
Best Python Online Training with Live Project by Expert
Multithreading programming in java
NDK Primer (AnDevCon Boston 2014)
Beginning Python
Introduction to programming with python
Introduction to concurrent programming with Akka actors
Multithreading in java
WeakReferences (java.lang.ref and more)
Intro to Objective C
The Java Memory Model
Ad

Viewers also liked (15)

PDF
Garage RDBMS
PDF
[TUTORIAL] PetitParser
PDF
Toward a Platform for Visual Debugging
PDF
A First Analysis of String APIs: the Case of Pharo
PDF
Mocks, Proxies, and Transpilation as Development Strategies for Web Development
PDF
The Glamorous Toolkit: Towards a novel live IDE
DOCX
governmentclassdiscussionboard2phase 1
PPT
Current CSR developments in the mining sector in Peru
DOCX
senthil int
DOCX
Santos 2
PDF
The Cog VM evolution
PDF
Presentación Lmeg Virtual Experience
PDF
Pragmas: Literal Messages as Powerful Method Annotations
DOCX
Federal Vs State Governments GOVT201IP1
PDF
Tony Hsieh Delivering Happiness @ Stanford GSB
Garage RDBMS
[TUTORIAL] PetitParser
Toward a Platform for Visual Debugging
A First Analysis of String APIs: the Case of Pharo
Mocks, Proxies, and Transpilation as Development Strategies for Web Development
The Glamorous Toolkit: Towards a novel live IDE
governmentclassdiscussionboard2phase 1
Current CSR developments in the mining sector in Peru
senthil int
Santos 2
The Cog VM evolution
Presentación Lmeg Virtual Experience
Pragmas: Literal Messages as Powerful Method Annotations
Federal Vs State Governments GOVT201IP1
Tony Hsieh Delivering Happiness @ Stanford GSB
Ad

Similar to A tour on Spur for non-VM experts (20)

PPTX
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
PPTX
Exploring .NET memory management - A trip down memory lane - Copenhagen .NET ...
PPTX
DotNetFest - Let’s refresh our memory! Memory management in .NET
PDF
.NET Fest 2018. Maarten Balliauw. Let’s refresh our memory! Memory management...
PPTX
84694646456445645645645665656465464sdd.pptx
PPTX
Container Torture: Run any binary, in any container
PPTX
ConFoo - Exploring .NET’s memory management – a trip down memory lane
PDF
Here comes the Loom - Ya!vaConf.pdf
PPTX
Vulnerability, exploit to metasploit
PDF
Profiler Guided Java Performance Tuning
PDF
Infrastructure as code might be literally impossible part 2
PPTX
Threading in C#
PDF
C# basics
PDF
From Java to Python: beating the Stockholm syndrome
ODP
Debugging With Id
ODP
Debugging
PDF
Industry - Program analysis and verification - Type-preserving Heap Profiler ...
PDF
Sensepost assessment automation
PPTX
Steelcon 2014 - Process Injection with Python
PDF
Python and Zope: An introduction (May 2004)
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
Exploring .NET memory management - A trip down memory lane - Copenhagen .NET ...
DotNetFest - Let’s refresh our memory! Memory management in .NET
.NET Fest 2018. Maarten Balliauw. Let’s refresh our memory! Memory management...
84694646456445645645645665656465464sdd.pptx
Container Torture: Run any binary, in any container
ConFoo - Exploring .NET’s memory management – a trip down memory lane
Here comes the Loom - Ya!vaConf.pdf
Vulnerability, exploit to metasploit
Profiler Guided Java Performance Tuning
Infrastructure as code might be literally impossible part 2
Threading in C#
C# basics
From Java to Python: beating the Stockholm syndrome
Debugging With Id
Debugging
Industry - Program analysis and verification - Type-preserving Heap Profiler ...
Sensepost assessment automation
Steelcon 2014 - Process Injection with Python
Python and Zope: An introduction (May 2004)

More from ESUG (20)

PDF
ShowUs: Pharo Stream Deck (ESUG 2025, Gdansk)
PDF
Micromaid: A simple Mermaid-like chart generator for Pharo
PDF
Directing Generative AI for Pharo Documentation
PDF
Even Lighter Than Lightweiht: Augmenting Type Inference with Primitive Heuris...
PDF
Composing and Performing Electronic Music on-the-Fly with Pharo and Coypu
PDF
Gamifying Agent-Based Models in Cormas: Towards the Playable Architecture for...
PDF
Analysing Python Machine Learning Notebooks with Moose
PDF
FASTTypeScript metamodel generation using FAST traits and TreeSitter project
PDF
Migrating Katalon Studio Tests to Playwright with Model Driven Engineering
PDF
Package-Aware Approach for Repository-Level Code Completion in Pharo
PDF
Evaluating Benchmark Quality: a Mutation-Testing- Based Methodology
PDF
An Analysis of Inline Method Refactoring
PDF
Identification of unnecessary object allocations using static escape analysis
PDF
Control flow-sensitive optimizations In the Druid Meta-Compiler
PDF
Clean Blocks (IWST 2025, Gdansk, Poland)
PDF
Encoding for Objects Matters (IWST 2025)
PDF
Challenges of Transpiling Smalltalk to JavaScript
PDF
Immersive experiences: what Pharo users do!
PDF
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
PDF
Cavrois - an Organic Window Management (ESUG 2025)
ShowUs: Pharo Stream Deck (ESUG 2025, Gdansk)
Micromaid: A simple Mermaid-like chart generator for Pharo
Directing Generative AI for Pharo Documentation
Even Lighter Than Lightweiht: Augmenting Type Inference with Primitive Heuris...
Composing and Performing Electronic Music on-the-Fly with Pharo and Coypu
Gamifying Agent-Based Models in Cormas: Towards the Playable Architecture for...
Analysing Python Machine Learning Notebooks with Moose
FASTTypeScript metamodel generation using FAST traits and TreeSitter project
Migrating Katalon Studio Tests to Playwright with Model Driven Engineering
Package-Aware Approach for Repository-Level Code Completion in Pharo
Evaluating Benchmark Quality: a Mutation-Testing- Based Methodology
An Analysis of Inline Method Refactoring
Identification of unnecessary object allocations using static escape analysis
Control flow-sensitive optimizations In the Druid Meta-Compiler
Clean Blocks (IWST 2025, Gdansk, Poland)
Encoding for Objects Matters (IWST 2025)
Challenges of Transpiling Smalltalk to JavaScript
Immersive experiences: what Pharo users do!
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
Cavrois - an Organic Window Management (ESUG 2025)

Recently uploaded (20)

PDF
Approach and Philosophy of On baking technology
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
cuic standard and advanced reporting.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
NewMind AI Monthly Chronicles - July 2025
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Approach and Philosophy of On baking technology
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
NewMind AI Weekly Chronicles - August'25 Week I
Network Security Unit 5.pdf for BCA BBA.
Agricultural_Statistics_at_a_Glance_2022_0.pdf
cuic standard and advanced reporting.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Building Integrated photovoltaic BIPV_UPV.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
NewMind AI Monthly Chronicles - July 2025
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Digital-Transformation-Roadmap-for-Companies.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
The AUB Centre for AI in Media Proposal.docx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Dropbox Q2 2025 Financial Results & Investor Presentation
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication

A tour on Spur for non-VM experts

  • 1. A Tour to Spur for Non-VM Experts Guille Polito, Christophe Demarey ESUG 2016, 22/08, Praha
  • 2. From a user point of view We are working on the new Pharo Kernel ● Bootstrap: create an image from scratch - Classes - Global objects - Processes and contexts ● Image Initialization: What is the correct order? BTW, see our talk on this ;) Mission Pharo Kernel, Thursday 10 am
  • 3. What is this talk about? Dec 14, 2015; 11:08am [IMPORTANT] Starting migration to Spur VM
  • 4. Initial Motivation to look into Spur 1) How do we move to Spur as fast as possible? 2) Should we / How do we adapt to it? 3) What are the risks?
  • 5. Motivation of this talk #1: Education Explain what is Spur Determine if a problem comes from image side or VM side?
  • 6. Motivation of this talk #2: Understanding the Impact Is my application compatible? Will It break? Do I have to port it?
  • 9. Spur is not a new Virtual Machine Its underlying execution engine is the same as in Cog (same bytecode, same interpreter, same JIT compiler)
  • 10. Spur is not a new Garbage Collector It just implements a new garbage collector (which, BTW, is not new...)
  • 11. Spur is not a new Object Format. It just implements a new object format (which, BTW, is just the means to an end)
  • 12. So... what is Spur? Spur is a new Memory Manager for Cog VM. - New object representation in memory (that allows ephemerons, pinned objects,...) - New memory organization of Pharo images (that allows to better manage resources)
  • 14. Spur in a Nutshell It's a Cog VM + 64 bits support + faster: x1.8 speedup + larger images (> 2 Go) + ephemeron support and more ...
  • 15. Spur > 64-bits support ● No more need to install 32-bits libraries ● Images with size > 2 Go
  • 16. Spur > faster access to classes Class Table ● Direct access to class objects 0 1 2 3 4 5 6 7 8 Array (hash=0) String (hash=6) Next page...
  • 17. Spur > faster Garbage Collector ● “Young objects die young (and fast)” ● Added survivor segments (future and past) to the young space => allows more minor GC instead of major GC future Old space Young Space past eden Major GC (mark & sweep) Minor GC (scavenger)
  • 18. Spur > Fast become No more hangs in large images when using #become: (e.g. Moose with a big famix model) Why? Spur introduces forwarders ● prevents to scan the whole memory ● replaces pointers when they are accessed ● implemented by a partial read barrier1 Cheap in most cases (just one indirection) Costly if you rely a lot on primitives fallback 1. Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient Support of Live Object-Oriented Programming. ISMM'15
  • 19. Spur > faster Immediate objects New immediate objects ● Character ● Float (only 64-bits) Speed-up in wide strings Speed-up in float arithmetic and memory saving
  • 20. Spur > other features Spur object format: ● All classes are compact => only two kind of headers (3 before Spur) ● Support for pinned-objects (see UFFI talk on Friday) ● Ongoing support of read-only objects ● Still 2 unused bits
  • 21. Spur > scalability ● Memory is now divided in several segments ● No more need to have a contiguous chunk of memory Memory segment Memory segment Memory segment Memory segment
  • 22. Spur > reliability ● Ephemeron finalization support ● Avoid memory leaks BTW, see our OTHER talk on this ;) A Weak Pharo story, Thursday, 3 pm
  • 23. Part 2: Porting applications and frameworks to Spur Cog Spur
  • 24. How do I port my application to Spur?
  • 28. Porting Applications Okay, maybe just wait that your developer friends port your favorite frameworks.
  • 30. Porting Basics #1 The number hierarchy changed ● Beware if you have visitors ● Beware if you have overrides Porting Frameworks/Libraries
  • 31. Porting Basics #2 Character is now immediate ● Beware if you have overrides that use the internal state Porting Frameworks/Libraries
  • 32. Porting Basics #3 New (enhanced) ephemeron finalization ● If you need finalization you'll probably want to use the new one BTW, see our OTHER talk on this ;) Porting Frameworks/Libraries A Weak Pharo story, Thursday, 3 pm
  • 33. Porting Basics #4 Native Boost is being deprecated ● If you are using FFI, you will need to review your bindings Porting Frameworks/Libraries Native Boost UFFI
  • 34. Spur Behind the Scenes
  • 35. VM development hosted on GitHub: OpenSmalltalk / opensmalltalk-vm
  • 36. Why is it a good news? ● Brings together the VM community ● Easier to contribute – Pull requests – Issue tracker – Documentation: https://github.com/OpenSmalltalk/opensmalltalk- vm/blob/Cog/CONTRIBUTING.md
  • 37. VM build all flavors through Travis CI Still missing VM tests. Upcoming?
  • 38. Where to find VM binaries? ● Pharo http://files.pharo.org/vm/ Squeak, NewSpeak https://bintray.com/opensmalltalk/vm/cog
  • 40. Should I move to Spur? Bounce BubbleSort DeltaBlue Fannkuch GraphSearch Json Mandelbrot Nbody PageRank Permute Queens QuickSort Sieve Storage Towers 0 0,2 0,4 0,6 0,8 1 1,2 1,4 1,6 1,8 Pre-Spur Spur by Stefan Marr, Apr 06, 2015
  • 41. Should I move to Spur? ✔ 64-bits support ✔ Increased performances: x1.8 speedup ✔ Scalability, Reliability and open to new features – image not compacting anymore (will be fixed soon)
  • 43. 1) Class tables 2) Forwarders 3) Ephemeron Finalization 4) The Scavenger GC Dissecting Spur...
  • 44. Chapter 1 Classes are in Tables (and they hide in tables)
  • 45. 1.1 The old object header...
  • 46. 1.1 Compact classes Smalltalk compactClassesArray
  • 47. 1.1 Cons of the old object header ● A full word is used to indicate an object's class – 4G classes in 32 bits – 16E (2^60) classes in 64 bits (!!) ● Three different headers => checks for the header type are common
  • 48. 1.2 New class header
  • 49. 1.2 Class table 0 1 2 3 4 5 6 7 8 Array (hash=0) String (hash=6) Next page...
  • 50. 1.2 Class table class idx = 0 0 1 2 3 4 5 6 7 8 Array (hash=0) String (hash=6) Next page...
  • 51. 1.2 Pros of the new object header ● 2^22 classes (4M). Still enough and efficient. ● Compatible with 64bits ● All classes are compact => only two kind of headers
  • 52. 1.2 Hidden objects 0 1 2 3 4 5 6 7 8 Array (hash=0) String (hash=6) Next page... Class idx = 1
  • 53. 1.2 Hidden objects? ● The class table is an object (and lives in the heap) ● Its class index is “hidden”: – Array allInstances will iterate objects by class index ● In the class table: – Indexes 0-15 are reserved for tagged objects – Indexes 16-32 are reserved for hidden classes
  • 54. 1.3 Maintaining the class table Classes are normal objects... They are created with no special primitives... But... How does the VM know an object is a class to put it into the class table?
  • 55. 1.3 Identifying classes by definition A class is an object that is instantiated: A class enters the class table upon instantiation
  • 56. 1.3 But the index is the hash! But... hashes are assigned lazily for all objects: Classes, on instance-side, define a special hash method Behavior >> basicIdentityHash <primitive: 175> self primitiveFailed Object >> basicIdentityHash <primitive: 75> self primitiveFailed
  • 57. Chapter 1 - Conclusions ● Classes are organized in tables ● All classes are compact ● Simpler object header ● Still place for 4M classes ● On the image side, is almost transparent
  • 59. 2.1 Become ● Swaps two objects – (actually, swaps two object's identity) ● Useful for: – Updating and migrating objects – Install proxies – Replace an object's behavior
  • 60. 2.1 The old become ● Full scanned all memory ● And was SLOOOOOW
  • 61. 2.1 Lazy become ba Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient Support of Live Object-Oriented Programming. ISMM'15
  • 62. 2.1 Lazy become b becomeForward: a. User's code Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient Support of Live Object-Oriented Programming. ISMM'15 ba
  • 63. 2.1 Lazy become Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient Support of Live Object-Oriented Programming. ISMM'15 b becomeForward: a. User's code a forwarder!
  • 64. 2.1 Lazy Become Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient Support of Live Object-Oriented Programming. ISMM'15 b becomeForward: a. b doSomething User's code a forwarder!
  • 65. 2.2 The read barrier ● A full read barrier would be too expensive – (on every read, on every primitive, on every message send...) ● The read barrier is implemented in two places: – Message send lookup failure – Primitive failure Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient Support of Live Object-Oriented Programming. ISMM'15
  • 66. 2.2 Message send lookup failure method := (self lookupSelector: selector inClass: class). method ifNil: [ (receiver isForwarder) ifTrue: [ receiver := receiver forward. “scan also the objects in the stack” ]. method := (self lookupSelector: selector inClass: class). ]. Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient Support of Live Object-Oriented Programming. ISMM'15
  • 67. 2.2 Primitive failure self performPrimitive: primitiveNumber. self primitiveFailed ifTrue: [ “scan the stack looking for forwarders and retry” self performPrimitive: primitiveNumber. ]. Eliot Miranda, Clément Bera. A Partial Read Barrier for Efficient Support of Live Object-Oriented Programming. ISMM'15
  • 68. 2 Conclusions ● Become does not need full scan anymore ● A forwarder replaces the object in place ● Two-way become copies object at the end ● Forwarders are bypassed using a partial read barrier: – Message lookup failure – Primitive failure ● No noticeable overhead
  • 69. 3.5 Scavenger GC ● “Young Objects Die Young (and quick)” ● Young objects are created in eden ● Objects are “tenured” after surviving several generations ● Tenured objects go to old space
  • 70. 3.5 Scavenger GC Old space New Space future past eden
  • 71. 3.5 Scavenger GC Old space New Space future past eden ● Mark and Sweep (marking collector) ● Runs “every blue moon” on the entire memory ● Slow ● Scavenger (copying collector) ● Runs often, only in new space ● Object tenure (to old space) depends on the ratio of allocation
  • 72. 3.5 Scavenger GC New Space future past eden 1) Future is always empty during execution
  • 73. 3.5 Scavenger GC New Space future past eden 1) Future is always empty during execution 2) On a GC, past and eden objects that are referenced are copied to future
  • 74. 3.5 Scavenger GC New Space past future eden 1) Future is always empty during execution 2) On a GC, past and eden objects that are referenced are copied to future 3) Then, future and past spaces are swapped
  • 75. 3.5 Scavenger GC Two questions remain: ● How does the scavenger do a GC without iterating the entire heap? ● How does he know object ages?
  • 76. 3.5 Scavenger GC Two questions remain: ● How does the scavenger do a GC without iterating the entire heap? ● How does he know object ages? It maintains a set of “objects in new space referenced from old space” By their addresses! Lower addresses are younger....
  • 77. Is that all? ● Pinned objects? ● The finalization queue? ● Memory segments, bridges, …? ● (The not working) Memory compaction? ● New immediate objects? ● ...