Simone Bordet
sbordet@webtide.com
G1 Garbage Collector
Details and Tuning
Simone Bordet
sbordet@webtide.com
Who Am I
Simone Bordet
 sbordet@intalio.com - @simonebordet
Lead Architect at Intalio/Webtide
 Jetty's HTTP/2, SPDY and HTTP client maintainer
Open Source Contributor
 Jetty, CometD, MX4J, Foxtrot, LiveTribe, JBoss, Larex
CometD project leader
 Web messaging framework
JVM tuning expert
Simone Bordet
sbordet@webtide.com
G1
Overview
Simone Bordet
sbordet@webtide.com
G1 Overview
G1 is the HotSpot low-pause collector
 First papers date back to 2004
 Available and supported since JDK 7u4 (April 2012)
Long term replacement for CMS
Scheduled to be the default GC for JDK 9
 JEP 248: http://openjdk.java.net/jeps/248
Low pauses valued more than max throughput
 For majority of Java Apps
 For the others, ParallelGC will still be available
Simone Bordet
sbordet@webtide.com
G1 Overview
G1 is designed to be really easy to tune
java -Xmx32G -XX:MaxGCPauseMillis=100 ...
Tuning based on max Stop-The-World pause
 -XX:MaxGCPauseMillis=<>
 By default 250 ms
Simone Bordet
sbordet@webtide.com
G1 Overview
G1 is a generational collector
G1 implements 2 GC algorithms
Young Generation GC
 Stop-The-World, Parallel, Copying
Old Generation GC
 Mostly-concurrent marking
 Incremental compaction
 Piggybacked on Young Generation GC
Simone Bordet
sbordet@webtide.com
G1 Logging
G1 has a very detailed logging
 Keep it ALWAYS enabled !
-XX:+PrintGCDateStamps
 Prints date and uptime
-XX:+PrintGCDetails
 Prints G1 Phases
-XX:+PrintAdaptiveSizePolicy
 Prints ergonomic decisions
-XX:+PrintTenuringDistribution
 Print aging information of survivor regions
Simone Bordet
sbordet@webtide.com
G1
Memory Layout
Simone Bordet
sbordet@webtide.com
G1 Memory Layout
Familiar with this ?
 Eden
 Survivor
 Tenured
Eden Tenured
Survivor
Young Generation
Old Generation
FORGET IT !
Simone Bordet
sbordet@webtide.com
G1 Memory Layout
G1 divides the heap into small “regions”
Targets 2048 regions
 Tuned via -XX:G1HeapRegionSize=<>
Eden, Survivor, Old regions
“Humongous” regions
 When a single object occupies > 50% of the region
 Typically byte[] or char[]
Simone Bordet
sbordet@webtide.com
G1 Memory Layout
G1 Memory Layout
O E H S E
O
O O S
E
E
H H H O O
OS E
E
S
O
H
Eden
Survivor
Old
Humongous
Simone Bordet
sbordet@webtide.com
G1 Young GC
JVM starts, G1 prepares Eden regions
Application runs and allocates into Eden regions
Eden regions fill up
When all Eden regions are full → Young GC
Simone Bordet
sbordet@webtide.com
G1 Young GC
The application does not only allocate
Application modifies pointers of existing objects
An “old” object may point to an “eden” object
 E.g. an “old” Map has just been put() a new entry
G1 must track these inter-generation pointers
 (Old | Humongous) → (Eden | Survivor) pointers
Simone Bordet
sbordet@webtide.com
G1 Young GC
Inter-generation references
A
B
C
D
E
F
Remembered Set (RS)
OLD EDEN
Card
Table
Simone Bordet
sbordet@webtide.com
G1 Remembered Set
A write barrier tracks pointer updates
object.field = <reference>
Triggers every time a pointer is written
 Records the write information in the card
 Cards are stored in a queue (dirty card queue)
 The queue is divided in 4 zones: white, green, yellow, red
Simone Bordet
sbordet@webtide.com
G1 Remembered Set
White zone
 Nothing happens, buffers are left unprocessed
Green zone (-XX:G1ConcRefinementGreenZone=<>)
 Refinements threads are activated
 Buffers are processed and the queue drained
Yellow zone (-XX:G1ConcRefinementYellowZone=<>)
 All available refinement threads are active
Red zone (-XX:G1ConcRefinementRedZone=<>)
 Application threads process the buffers
Simone Bordet
sbordet@webtide.com
G1
Young GC
Phases
Simone Bordet
sbordet@webtide.com
G1 Young GC Phases
G1 Stops The World
G1 builds a “collection set”
 The regions that will be subject to collection
In a Young GC, the collection set contains:
 Eden regions
 Survivor regions
Simone Bordet
sbordet@webtide.com
G1 Young GC Phases
First phase: “Root Scanning”
 Static and local objects are scanned
Second phase: “Update RS”
 Drains the dirty card queue to update the RS
Third phase: “Process RS”
 Detect the Eden objects pointed by Old objects
Simone Bordet
sbordet@webtide.com
G1 Young GC Phases
Fourth phase: “Object Copy”
 The object graph is traversed
 Live objects copied to Survivor/Old regions
Fifth phase: “Reference Processing”
 Soft, Weak, Phantom, Final, JNI Weak references
 Always enable -XX:+ParallelRefProcEnabled
 More details with -XX:+PrintReferenceGC
Simone Bordet
sbordet@webtide.com
G1 Young GC Phases
G1 tracks phase times to autotune
Phase timing used to change the # of regions
 Eden region count
 Survivor region count
By updating the # of regions
 Respect of max pause target
Typically, the shorter the pause target, the
smaller the # of Eden regions
Simone Bordet
sbordet@webtide.com
G1 Young GC Phases
G1 Young GC
 E and S regions evacuated to new S and O regions
O E H S E
O
O O S
E
E
H H H O O
OS E
E
S
O
H
Eden
Survivor
Old
Humongous
Simone Bordet
sbordet@webtide.com
G1 Young GC Phases
G1 Young GC
O S E H E
O
O O
E
E
H H H S O O
O O E
E
S
O
H
Eden
Survivor
Old
Humongous
Simone Bordet
sbordet@webtide.com
G1
Old GC
Simone Bordet
sbordet@webtide.com
G1 Old GC
G1 schedules an Old GC based on heap usage
 By default when the entire heap is 45% full
 Checked after a Young GC or a humongous allocation
 Tunable via -XX:InitiatingHeapOccupancyPercent=<>
The Old GC consists of old region marking
 Finds all the live objects in the old regions
 Old region marking is concurrent
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking
 Tri-color marking
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking
 Roots marked black – children marked gray
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking
 Gray wavefront advances
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking
 Gray wavefront advances
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking
 Gray wavefront advances
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking
 Marking complete – white objects are garbage
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking: Lost Object Problem
 Marking in progress
A
B
C
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking: Lost Object Problem
 Application write: A.c = C;
A
B
C
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking: Lost Object Problem
 Application write: B.c = null;
A
B
C
Simone Bordet
sbordet@webtide.com
G1 Old GC
Concurrent marking: Lost Object Problem
 Marking completes
A
B
C
Simone Bordet
sbordet@webtide.com
G1 Old GC
G1 uses a write barrier to detect: B.c = null;
 More precisely that a pointer to C has been deleted
G1 now knows about object C
 Speculates that object C will remain alive
Snapshot-At-The-Beginning (SATB)
 Preserves the object graph that was live at marking start
 C is queued and processed during remark
 May retain floating garbage, collected the next cycle
Simone Bordet
sbordet@webtide.com
G1
Old GC
Phases
Simone Bordet
sbordet@webtide.com
G1 Old GC Phases
G1 Stops The World
Performs a Young GC
 Piggybacks Old region roots detection (initial-mark)
G1 resumes application threads
Concurrent Old region marking proceeds
 Keeps track of references (soft, weak, etc.)
 Computes per-region liveness information
Simone Bordet
sbordet@webtide.com
G1 Old GC Phases
G1 Stops The World
Remark phase
 SATB queue processing
 Reference processing
Cleanup phase
 Empty old regions are immediately recycled
Application threads are resumed
Simone Bordet
sbordet@webtide.com
G1 Old GC Phases
[GC pause (G1 Evacuation Pause) (young)
(initial-mark)
[GC concurrent-root-region-scan-start]
[GC concurrent-root-region-scan-end, 0.0566056
secs]
[GC concurrent-mark-start]
[GC concurrent-mark-end, 1.6776461 secs]
[GC remark, 0.0488021 secs]
[GC cleanup 16G->14G(32G), 0.0557430 secs]
Simone Bordet
sbordet@webtide.com
G1 Old GC Phases
Cleanup phase → recycles empty old regions
What about non-empty old regions ?
 How is fragmentation resolved ?
Non-empty Old regions processing
 Happens during the next Young GC cycle
 No rush to clean the garbage in Old regions
Simone Bordet
sbordet@webtide.com
G1 Mixed GC
“Mixed” GC – piggybacked on Young GCs
 By default G1 performs 8 mixed GC
 -XX:G1MixedGCCountTarget=<>
The collection set includes
 Part (1/8) of the remaining Old regions to collect
 Eden regions
 Survivor regions
Algorithm is identical to Young GC
 Stop-The-World, Parallel, Copying
Simone Bordet
sbordet@webtide.com
Old regions with most garbage are chosen first
 -XX:G1MixedGCLiveThresholdPercent=<>
 Defaults to 85%
G1 wastes some heap space (waste threshold)
 -XX:G1HeapWastePercent=<>
 Defaults to 5%
Mixed GCs are stopped:
 When old region garbage <= waste threshold
 Therefore, mixed GC count may be less than 8
Simone Bordet
sbordet@webtide.com
G1 Mixed GC
G1 Mixed GC
O S E H E
O
O O
E
E
H H H S O O
O O E
E
S
O
H
Eden
Survivor
Old
Humongous
Simone Bordet
sbordet@webtide.com
G1 Mixed GC
G1 Mixed GC
O E H O E
O
SO S
E
E
H H H O O
O O E
E
S
O
H
Eden
Survivor
Old
Humongous
Simone Bordet
sbordet@webtide.com
G1
General Advices
Simone Bordet
sbordet@webtide.com
G1 General Advices
Avoid at all costs Full GCs
 The Full GC is single threaded and REALLY slow
 Also because G1 likes BIG heaps !
Grep the GC logs for “Full GC”
 Use -XX:+PrintAdaptiveSizePolicy to know what
caused it
Simone Bordet
sbordet@webtide.com
G1 Mixed GC
Avoid “to-space exhausted”
 Not enough space to move objects to
 Increase max heap size
 G1 works better with more room to maneuver
O O E H O E
O
E S EO E S
E
E
H H H E E O O
OS O O E
E
S
O
H
Eden
Survivor
Old
Humongous
Simone Bordet
sbordet@webtide.com
G1 General Advices
Avoid too many “humongous” allocations
 -XX:+PrintAdaptiveSizePolicy prints the GC reason
 Increase max heap size
 Increase region size: -XX:G1HeapRegionSize=<>
Example
 Max heap size 32 GiB → region size = 16 MiB
 Humongous limit → 8 MiB
 Allocations of 12 MiB arrays
 Set region size to 32 MiB
 Humongous limit is now 16 MiB
 12 MiB arrays are not humongous anymore
Simone Bordet
sbordet@webtide.com
G1 General Advices
Avoid lengthy reference processing
 Always enable -XX:+ParallelRefProcEnabled
 More details with -XX:+PrintReferenceGC
Find the cause for WeakReferences
 ThreadLocals
 RMI
 Third party libraries
Simone Bordet
sbordet@webtide.com
Real World
Example
Simone Bordet
sbordet@webtide.com
Real World Example
Online Chess Game Application
20k requests/s – Jetty server
1 server, 64 GiB RAM, 2x24 cores
Allocation rate: 0.5-1.2 GiB/s
CMS to G1 Migration
Simone Bordet
sbordet@webtide.com
Real World Example
Issue #1: MetaSpace
[Full GC (Metadata GC Threshold) [Times:
user=19.58 sys=0.00, real=13.72 secs]
Easy fix: -XX:MetaspaceSize=<>
Cannot guess how much MetaSpace you need ?
 Start big (e.g. 250 MiB) and monitor it
13.72 secs Full GC !
Simone Bordet
sbordet@webtide.com
Real World Example
Issue #2: Max target pause
We set -XX:MaxGCPauseMillis=250
Percentiles after GC log processing (24h run):
 50.00% → 250 ms
 90.00% → 300 ms
 95.00% → 360 ms
 99.00% → 500 ms
 99.90% → 623 ms
 99.99% → 748 ms
 100.0% → 760 ms
Simone Bordet
sbordet@webtide.com
Real World Example
Issue #3: Mixed GCs
G1 tries to respect max pause target
Must account for old regions, not only young
 Currently G1 shrinks the young generation
[GC pause (G1 Evacuation Pause) (young)
[Eden: 12.4G(12.4G)->0.0B(608.0M) ...
[GC pause (G1 Evacuation Pause) (mixed)
Eden: 12.4 GiB → 0.6 GiB
Simone Bordet
sbordet@webtide.com
Real World Example
Issue #3: Mixed GCs
Young Generation shrunk by a factor 20x
 But the allocation rate does not change !
Young GCs become more frequent
 Application throughput suffers
Minimum Mutator Utilization (MMU) drops
Simone Bordet
sbordet@webtide.com
Real World Example
Young/Mixed GCs: Events
 X axis: event time
Simone Bordet
sbordet@webtide.com
Real World Example
Young/Mixed GCs: Eden Size
Simone Bordet
sbordet@webtide.com
Real World Example
Young/Mixed GCs: MMU (2 s window)
Simone Bordet
sbordet@webtide.com
Real World Example
Young/Mixed GCs: MMU (5 s window)
Simone Bordet
sbordet@webtide.com
Conclusions
Simone Bordet
sbordet@webtide.com
Conclusions
G1 is the future
Good chances that “it just works”
Easier to tune than CMS
 Yet, you must know exactly how it works to tune it better
Not yet that respectful of GC pause target
 At least in our case, YMMV
Simone Bordet
sbordet@webtide.com
Conclusions
Still based on Stop-The-World pauses
 For extremely low latencies you need other solutions
Always use the most recent JDK
 You'll benefit from continuous improvements to G1
Simone Bordet
sbordet@webtide.com
References
Simone Bordet
sbordet@webtide.com
References
Search SlideShare for “G1 GC”
 Beckwith, Hunt, and others
Numerous articles on Oracle's site
 Yu Zhang
 Poonam Bajaj
 Monica Beckwith
OpenJDK HotSpot GC Mailing List
 hotspot-gc-use@openjdk.java.net
Simone Bordet
sbordet@webtide.com
Questions
&
Answers

More Related Content

PPTX
PLC and SCADA communication
PPTX
Diabetes Mellitus
PPTX
Hypertension
PPTX
Republic Act No. 11313 Safe Spaces Act (Bawal Bastos Law).pptx
PPTX
Power Point Presentation on Artificial Intelligence
PDF
Caça palavras - Bullying
PPTX
PLC and SCADA communication
Diabetes Mellitus
Hypertension
Republic Act No. 11313 Safe Spaces Act (Bawal Bastos Law).pptx
Power Point Presentation on Artificial Intelligence
Caça palavras - Bullying

What's hot (20)

PDF
Models for hierarchical data
PPTX
Developing High-Impact Malware with Minimal Effort.pptx
PDF
GraalVM Native Images by Oleg Selajev @shelajev
PDF
CNIT 126: 10: Kernel Debugging with WinDbg
PDF
Secrets of Performance Tuning Java on Kubernetes
PPTX
JVM++: The Graal VM
PDF
Scalability, Availability & Stability Patterns
PPTX
Bug Bounty 101
PDF
Embedded Virtualization for Mobile Devices
PDF
Gradle Introduction
PPTX
The Travelling Pentester: Diaries of the Shortest Path to Compromise
PPTX
Kafka error handling patterns and best practices | Hemant Desale and Aruna Ka...
PDF
Spring mvc
PDF
Understanding PostgreSQL LW Locks
PDF
Galera Cluster DDL and Schema Upgrades 220217
PPTX
Bug Bounty #Defconlucknow2016
PPTX
Rest API Security
PDF
이벤트 기반 분산 시스템을 향한 여정
PDF
Software Vulnerabilities in C and C++ (CppCon 2018)
PPTX
LLAP: long-lived execution in Hive
Models for hierarchical data
Developing High-Impact Malware with Minimal Effort.pptx
GraalVM Native Images by Oleg Selajev @shelajev
CNIT 126: 10: Kernel Debugging with WinDbg
Secrets of Performance Tuning Java on Kubernetes
JVM++: The Graal VM
Scalability, Availability & Stability Patterns
Bug Bounty 101
Embedded Virtualization for Mobile Devices
Gradle Introduction
The Travelling Pentester: Diaries of the Shortest Path to Compromise
Kafka error handling patterns and best practices | Hemant Desale and Aruna Ka...
Spring mvc
Understanding PostgreSQL LW Locks
Galera Cluster DDL and Schema Upgrades 220217
Bug Bounty #Defconlucknow2016
Rest API Security
이벤트 기반 분산 시스템을 향한 여정
Software Vulnerabilities in C and C++ (CppCon 2018)
LLAP: long-lived execution in Hive
Ad

Viewers also liked (11)

PPTX
Am I reading GC logs Correctly?
PDF
RxNetty vs Tomcat Performance Results
PDF
Troubleshooting PostgreSQL Streaming Replication
PDF
Row Pattern Matching in SQL:2016
PDF
Java Performance Analysis on Linux with Flame Graphs
PPTX
Shell,信号量以及java进程的退出
PDF
SREcon 2016 Performance Checklists for SREs
POTX
Performance Tuning EC2 Instances
PDF
Blazing Performance with Flame Graphs
PDF
Linux 4.x Tracing Tools: Using BPF Superpowers
PDF
Container Performance Analysis
Am I reading GC logs Correctly?
RxNetty vs Tomcat Performance Results
Troubleshooting PostgreSQL Streaming Replication
Row Pattern Matching in SQL:2016
Java Performance Analysis on Linux with Flame Graphs
Shell,信号量以及java进程的退出
SREcon 2016 Performance Checklists for SREs
Performance Tuning EC2 Instances
Blazing Performance with Flame Graphs
Linux 4.x Tracing Tools: Using BPF Superpowers
Container Performance Analysis
Ad

Similar to G1 Garbage Collector: Details and Tuning (20)

PDF
Low pause GC in HotSpot
PDF
Understanding JVM GC: advanced!
ODP
Introduction to Git (Greg Lonnon)
PPTX
Git-guidance for beginner- IT support.pptxGit-guidance for beginner- IT suppo...
PPTX
02-Git-and-github-sharing-for-beginner.pptx
PDF
[CB20] DeClang: Anti-hacking compiler by Mengyuan Wan
PDF
Tuning the HotSpot JVM Garbage Collectors
PDF
Understanding git
PDF
【英】QuadceptVer10-7_ReleaseNote.pdf
PPTX
iOS Gaming with Cocos2d
PDF
Speeding Up Distributed Machine Learning Using Codes
PPTX
Understanding memory management in xamarin forms
PPTX
G1 Garbage Collector - Big Heaps and Low Pauses?
PDF
That's (g)it! par Sébastien Dawans CETIC
PDF
Intro to Rust from Applicative / NY Meetup
TXT
Iso creationlog
PPTX
YET ANOTHER INTRODCTION AND AN EXAMPLE HOW NOT TO USE BAD PRESENTATION STYLES
PPT
Partner Generation for Petri Net Based Service Models
PDF
Scala can do this, too
PDF
Technical Excellence - OOP Munich 2015
Low pause GC in HotSpot
Understanding JVM GC: advanced!
Introduction to Git (Greg Lonnon)
Git-guidance for beginner- IT support.pptxGit-guidance for beginner- IT suppo...
02-Git-and-github-sharing-for-beginner.pptx
[CB20] DeClang: Anti-hacking compiler by Mengyuan Wan
Tuning the HotSpot JVM Garbage Collectors
Understanding git
【英】QuadceptVer10-7_ReleaseNote.pdf
iOS Gaming with Cocos2d
Speeding Up Distributed Machine Learning Using Codes
Understanding memory management in xamarin forms
G1 Garbage Collector - Big Heaps and Low Pauses?
That's (g)it! par Sébastien Dawans CETIC
Intro to Rust from Applicative / NY Meetup
Iso creationlog
YET ANOTHER INTRODCTION AND AN EXAMPLE HOW NOT TO USE BAD PRESENTATION STYLES
Partner Generation for Petri Net Based Service Models
Scala can do this, too
Technical Excellence - OOP Munich 2015

More from Simone Bordet (8)

PDF
Java 13 Updates
ODP
Java 9/10/11 - What's new and why you should upgrade
ODP
Java 10 - Updates
ODP
Java 9 - Part 2: Jigsaw Modules
ODP
Java 9 - Part1: New Features (Not Jigsaw Modules)
ODP
Servlet 3.1 Async I/O
ODP
HTTP/2 and Java: Current Status
ODP
Cloud-Ready Web Messaging with CometD
Java 13 Updates
Java 9/10/11 - What's new and why you should upgrade
Java 10 - Updates
Java 9 - Part 2: Jigsaw Modules
Java 9 - Part1: New Features (Not Jigsaw Modules)
Servlet 3.1 Async I/O
HTTP/2 and Java: Current Status
Cloud-Ready Web Messaging with CometD

Recently uploaded (20)

PDF
The Dynamic Duo Transforming Financial Accounting Systems Through Modern Expe...
PPTX
most interesting chapter in the world ppt
PPTX
Full-Stack Developer Courses That Actually Land You Jobs
DOC
UTEP毕业证学历认证,宾夕法尼亚克拉里恩大学毕业证未毕业
PDF
iTop VPN Crack Latest Version Full Key 2025
DOCX
How to Use SharePoint as an ISO-Compliant Document Management System
PDF
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
PDF
Wondershare Recoverit Full Crack New Version (Latest 2025)
PDF
MCP Security Tutorial - Beginner to Advanced
PPTX
4Seller: The All-in-One Multi-Channel E-Commerce Management Platform for Glob...
PPTX
Cybersecurity-and-Fraud-Protecting-Your-Digital-Life.pptx
PDF
AI/ML Infra Meetup | Beyond S3's Basics: Architecting for AI-Native Data Access
PPTX
Tech Workshop Escape Room Tech Workshop
PPTX
Python is a high-level, interpreted programming language
PPTX
Introduction to Windows Operating System
PPTX
Matchmaking for JVMs: How to Pick the Perfect GC Partner
PPTX
How to Odoo 19 Installation on Ubuntu - CandidRoot
PDF
AI-Powered Threat Modeling: The Future of Cybersecurity by Arun Kumar Elengov...
PDF
Workplace Software and Skills - OpenStax
PPTX
Computer Software - Technology and Livelihood Education
The Dynamic Duo Transforming Financial Accounting Systems Through Modern Expe...
most interesting chapter in the world ppt
Full-Stack Developer Courses That Actually Land You Jobs
UTEP毕业证学历认证,宾夕法尼亚克拉里恩大学毕业证未毕业
iTop VPN Crack Latest Version Full Key 2025
How to Use SharePoint as an ISO-Compliant Document Management System
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
Wondershare Recoverit Full Crack New Version (Latest 2025)
MCP Security Tutorial - Beginner to Advanced
4Seller: The All-in-One Multi-Channel E-Commerce Management Platform for Glob...
Cybersecurity-and-Fraud-Protecting-Your-Digital-Life.pptx
AI/ML Infra Meetup | Beyond S3's Basics: Architecting for AI-Native Data Access
Tech Workshop Escape Room Tech Workshop
Python is a high-level, interpreted programming language
Introduction to Windows Operating System
Matchmaking for JVMs: How to Pick the Perfect GC Partner
How to Odoo 19 Installation on Ubuntu - CandidRoot
AI-Powered Threat Modeling: The Future of Cybersecurity by Arun Kumar Elengov...
Workplace Software and Skills - OpenStax
Computer Software - Technology and Livelihood Education

G1 Garbage Collector: Details and Tuning