Cборка мусора в Java без пауз (HighLoad++ 2013)aragozin
Доклад про паузы при сборке мусора уже был на одной из прошлых конференций HighLoad++.
Паузы stop-the-world являются неотъемлемым атрибутом автоматического управления памятью.
Или всё-таки их можно избежать? – Можно!
Алгоритмы, не требующие пауз для управления памятью, существуют. Существуют и реальные JVM, которые их реализуют.
Содержание доклада
- Принципы автоматического управления памятью (сборки мусора).
- "Метроном" - классический алгоритм сборки мусора без пауз.
- С4 - алгоритм сборки мусора Zing JVM (Azul Systems).
- Особенности эффективной реализации на x86-архитектуре.
- Дополнительные источники проблем: слабые ссылки, фрагментация и прочее.
Презентация с Highload++ 2011
---
Принципы работы сборщика мусора в JVM. Использование принципа поколений. Параллельная и фоновая сборка мусора. Особенности реализации алгоритмов сборки мусора в HostSpot и JRockit JVM. Причины пауз сборки мусора и способы борьбы с ними. Особенности работы с "большими" JVM - 32 гигабайта и больше. Альтернативы сборщике мусора, прямое управление памятью в Java.
Cборка мусора в Java без пауз (HighLoad++ 2013)aragozin
Доклад про паузы при сборке мусора уже был на одной из прошлых конференций HighLoad++.
Паузы stop-the-world являются неотъемлемым атрибутом автоматического управления памятью.
Или всё-таки их можно избежать? – Можно!
Алгоритмы, не требующие пауз для управления памятью, существуют. Существуют и реальные JVM, которые их реализуют.
Содержание доклада
- Принципы автоматического управления памятью (сборки мусора).
- "Метроном" - классический алгоритм сборки мусора без пауз.
- С4 - алгоритм сборки мусора Zing JVM (Azul Systems).
- Особенности эффективной реализации на x86-архитектуре.
- Дополнительные источники проблем: слабые ссылки, фрагментация и прочее.
Презентация с Highload++ 2011
---
Принципы работы сборщика мусора в JVM. Использование принципа поколений. Параллельная и фоновая сборка мусора. Особенности реализации алгоритмов сборки мусора в HostSpot и JRockit JVM. Причины пауз сборки мусора и способы борьбы с ними. Особенности работы с "большими" JVM - 32 гигабайта и больше. Альтернативы сборщике мусора, прямое управление памятью в Java.
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkMoscowDataFest
Presentation from Moscow Data Fest #1, September 12.
Moscow Data Fest is a free one-day event that brings together Data Scientists for sessions on both theory and practice.
Link: http://www.meetup.com/Moscow-Data-Fest/
Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
Обеспечение достойной производительности высокоуровневого языка с динамической типизацией - непростая задача. Just-in-time (JIT) компиляция - динамическая генерация машинного кода с учетом информации, собранной во время выполнения приложения - ключевой элемент производительности виртуальной машины (будь то Java, .NET или даже JavaScript). JIT-компилятор, в свою очередь, должен иметь впечатляющий набор трюков и оптимизаций, что бы компенсировать "динамизм" языка.
В докладе речь пойдет о достижениях современной JIT компиляции в целом и более подробно будут освещены особенности HotSpot JVM (бесплатной JVM от Oracle)
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахYandex
В докладе рассказано о вычислительной модели на графах, в основе которой лежит механизм передачи сообщений между вершинами, а также о реализации в рамках данной модели API для написания алгоритмов на C++.
Checkpoint and Restore In Userspace: Готово или нет?OpenVZ
Доклад рассказывает о проекте CRIU (Checkpoint/Restore in Userspace) — сохранения (checkpoint) полного состояния работающих процессов с последующим их восстановлением (restore), реализованном по большей части как пользовательская (userspace) программа. Начинается он с истории о том, почему в ванильном ядре Linux до сих пор нет реализации checkpoint/restore, и как мы это побороли. В основной части доклада рассматриваются механизмы работы CRIU, в частности как сохраняются и восстанавливаются процессы, открытые файлы, память, сетевые соединения, терминалы и т.п. В заключении рассказывается о том, для чего можно использовать такой механизм (а это не только "живая" миграция), даётся текущий статус проекта и творческие планы разработчиков, и, конечно, демонстрация основных возможностей CRIU на живой системе.
https://events.yandex.ru/lib/talks/352/
Modern neural net architectures - Year 2019 versionGrigory Sapunov
Slides from the talk on UseData 2019 conference. Describes what happened in the NN architecture space in the last two years. Focus on production-ready things. Other interesting but more research-related topics (like Graph networks) are not covered here.
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
Let's calculate an average of one column for each key, like the following query: SELECT key, avg(value) FROM table GROUP BY key. What can be more simple? But the question is: what is the most efficient way to do it? How to write code to achieve maximum performance on a variety of hardware?
This document discusses garbage collection in the Java Virtual Machine (JVM). It begins with common terms related to garbage collection like stop-the-world pauses and compacting algorithms. It then covers the diversity of garbage collection techniques for different heap sizes, including young generation collection and concurrent mark sweep. Potential dangers of different garbage collection approaches are listed. The document also summarizes the economy of different garbage collection algorithms and discusses the weak generational thesis.
This document discusses ORM cache hierarchies and distributed caching. It describes two levels of caching - a session level cache and a query/entry cache level. It addresses consistency problems with caching and discusses solutions like using distributed locks or JTA transaction managers. It also proposes executing queries directly in the entity cache to avoid invalidation issues, and discusses writing data behind asynchronously to caches instead of synchronously to databases.
From distributed caches to in-memory data gridsMax Alexejev
This document summarizes a presentation about distributed caching technologies from key-value stores to in-memory data grids. It discusses the memory hierarchy and how software caches can improve performance by reducing data access latency and offloading storage. Different caching patterns like cache-aside, read-through, write-through and write-behind are explained. Popular caching products including Memcached, Redis, Cassandra and data grids are overviewed. Advanced concepts covered include data distribution, replication, consistency protocols and use cases.
The document discusses patterns and techniques for using Coherence cache with a database backend. It describes the benefits of using a read-write-backing map, which separates caching from database operations and allows write-behind for better performance. It also discusses challenges like slower database operations and ensuring data persistence. The document provides tips on using BinaryEntryStore as an alternative to CacheLoader/CacheStore, and when storeAll operations are called. It explains how to preload data and check for stored operations. Overall, it provides guidance on optimizing Coherence cache performance when backed by a database.
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkMoscowDataFest
Presentation from Moscow Data Fest #1, September 12.
Moscow Data Fest is a free one-day event that brings together Data Scientists for sessions on both theory and practice.
Link: http://www.meetup.com/Moscow-Data-Fest/
Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
Обеспечение достойной производительности высокоуровневого языка с динамической типизацией - непростая задача. Just-in-time (JIT) компиляция - динамическая генерация машинного кода с учетом информации, собранной во время выполнения приложения - ключевой элемент производительности виртуальной машины (будь то Java, .NET или даже JavaScript). JIT-компилятор, в свою очередь, должен иметь впечатляющий набор трюков и оптимизаций, что бы компенсировать "динамизм" языка.
В докладе речь пойдет о достижениях современной JIT компиляции в целом и более подробно будут освещены особенности HotSpot JVM (бесплатной JVM от Oracle)
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахYandex
В докладе рассказано о вычислительной модели на графах, в основе которой лежит механизм передачи сообщений между вершинами, а также о реализации в рамках данной модели API для написания алгоритмов на C++.
Checkpoint and Restore In Userspace: Готово или нет?OpenVZ
Доклад рассказывает о проекте CRIU (Checkpoint/Restore in Userspace) — сохранения (checkpoint) полного состояния работающих процессов с последующим их восстановлением (restore), реализованном по большей части как пользовательская (userspace) программа. Начинается он с истории о том, почему в ванильном ядре Linux до сих пор нет реализации checkpoint/restore, и как мы это побороли. В основной части доклада рассматриваются механизмы работы CRIU, в частности как сохраняются и восстанавливаются процессы, открытые файлы, память, сетевые соединения, терминалы и т.п. В заключении рассказывается о том, для чего можно использовать такой механизм (а это не только "живая" миграция), даётся текущий статус проекта и творческие планы разработчиков, и, конечно, демонстрация основных возможностей CRIU на живой системе.
https://events.yandex.ru/lib/talks/352/
Modern neural net architectures - Year 2019 versionGrigory Sapunov
Slides from the talk on UseData 2019 conference. Describes what happened in the NN architecture space in the last two years. Focus on production-ready things. Other interesting but more research-related topics (like Graph networks) are not covered here.
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
Let's calculate an average of one column for each key, like the following query: SELECT key, avg(value) FROM table GROUP BY key. What can be more simple? But the question is: what is the most efficient way to do it? How to write code to achieve maximum performance on a variety of hardware?
This document discusses garbage collection in the Java Virtual Machine (JVM). It begins with common terms related to garbage collection like stop-the-world pauses and compacting algorithms. It then covers the diversity of garbage collection techniques for different heap sizes, including young generation collection and concurrent mark sweep. Potential dangers of different garbage collection approaches are listed. The document also summarizes the economy of different garbage collection algorithms and discusses the weak generational thesis.
This document discusses ORM cache hierarchies and distributed caching. It describes two levels of caching - a session level cache and a query/entry cache level. It addresses consistency problems with caching and discusses solutions like using distributed locks or JTA transaction managers. It also proposes executing queries directly in the entity cache to avoid invalidation issues, and discusses writing data behind asynchronously to caches instead of synchronously to databases.
From distributed caches to in-memory data gridsMax Alexejev
This document summarizes a presentation about distributed caching technologies from key-value stores to in-memory data grids. It discusses the memory hierarchy and how software caches can improve performance by reducing data access latency and offloading storage. Different caching patterns like cache-aside, read-through, write-through and write-behind are explained. Popular caching products including Memcached, Redis, Cassandra and data grids are overviewed. Advanced concepts covered include data distribution, replication, consistency protocols and use cases.
The document discusses patterns and techniques for using Coherence cache with a database backend. It describes the benefits of using a read-write-backing map, which separates caching from database operations and allows write-behind for better performance. It also discusses challenges like slower database operations and ensuring data persistence. The document provides tips on using BinaryEntryStore as an alternative to CacheLoader/CacheStore, and when storeAll operations are called. It explains how to preload data and check for stored operations. Overall, it provides guidance on optimizing Coherence cache performance when backed by a database.
High Performance Computing - Cloud Point of Viewaragozin
This document discusses high performance computing in the cloud. It covers different types of workloads like I/O bound, CPU bound, and latency bound tasks. It also discusses handling task streams and structured batch jobs in the cloud. It proposes using techniques like worker pools, task queues, routing overlays, and task stealing for scheduling tasks. It discusses challenges around distributing large data sets across cloud resources and proposes solutions like caching data in memory grids. Finally, it argues that frameworks like Hadoop are not well suited for the cloud and proposes cloud-friendly alternatives like Peregrine and Spark.
Performance Test Driven Development with Oracle Coherencearagozin
This presentation discusses test driven development with Oracle Coherence. It outlines the philosophy of PTDD and challenges of testing Coherence, including the need for a cluster and sensitivity to network issues. It discusses automating tests using tools like NanoCloud for managing nodes and executing tests remotely. Different types of tests are described like microbenchmarks, performance regression tests, and bottleneck analysis. Common pitfalls of performance testing like fixed users vs fixed request rates are also covered.
Дмитрий Грошев, Фёдор Гоголев. Erlang и Haskell в production: проблемы и решенияFProg
В докладе рассматривается мотивация и опыт перехода процесса разработки API с большим количеством внутренней логики с Python на сочетание Erlang и Haskell, проблемы в процессе разработки и способы их решения.
MyRocks: табличный движок для MySQL на основе RocksDBSergey Petrunya
MyRocks: табличный движок для MySQL на основе RocksDB.
Презентация с HighLoad++ 2015.
Рассказывается о принципах работы LSM-Trees, их реализации в RocksDB, зачем и как был сделан MyRocks, с какими проблемами столкнулись и как их решили.
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...Ontico
Facebook использует MySQL в качестве основного хранилища данных. MySQL работает на десятках тысяч серверов в нескольких ЦОДах. В качестве дисков используются Flash-накопители. Они дают большую производительность, но дорогой ценой — MySQL хранит данные на диске в структуре B-tree, которая использует flash-диск неоптимальным образом. В масштабах Facebook'a цена вопроса измеряется миллионами долларов.
Для оптимального использования Flash-дисков в Facebook была разработана библиотека RocksDB. Она основана на LSM-деревьях и оптимизирована для работы в условиях высокой загрузки. Чтобы использовать ее из MySQL, [совместно с MariaDB] был разработан табличный движок — MyRocks.
Данный доклад посвящен RocksDB и MyRocks. Мы расскажем о принципах их работы и преимуществах, как их настраивать, и какие возможны подводные камни.
Авторы доклада — ведущие разработчики MyRocks от Facebook и MariaDB.
RocksDB и MyRocks доступны на GitHub для свободного использования, участие в разработке также приветствуется.
Современная операционная система: что надо знать разработчику / Александр Кри...Ontico
Мы проговорим про связь приложения и ОС, какие компоненты есть в современной ОС на примере Linux, как настройки этих компонент могут повлиять на приложение.
Я расскажу про планировщик процессов, дисковый и сетевой ввод-вывод и соответствующие планировщики, управление памятью - как это все в общих чертах работает и как его потюнить.
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Ontico
Всем известно о существовании временных таблиц в PostgreSQL, но как они устроены, и чем грозит их некорректное использование - не столь очевидно.
На примере одного известного приложения, активно и некорректно использующего временные таблицы, мы расскажем о создаваемой ими проблеме фрагментации памяти.
Что такое фрагментация памяти, по каким признакам можно определить ее наличие, чем она грозит, почему она возникает при активном использовании временных таблиц, и как мы пропатчили PostgreSQL, чтобы ее избежать - обо всем этом можно узнать из нашего доклада.
Сергій Комлач
— Android розробник в Sticky Password (Чехія).
— Головні напрямки роботи — біометрична ідентифікація, кібер-безпека, кросс-платформенні рішення.
— Досвід у сфері розробки під Мобайл понад 8 років.
— Переможець Opera Mobile Store Awards.
— Спікер та учасник: Lviv Mobile Development Day, UAMobile, Frameworks Day Android, Code'n'Coffee Khmelnitsky, Google DevFest UA.
— Засновник та лідер Google Developers Group Kremenchuk.
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
This talk about how android developers can use sun.misc.Unsafe for boost their app speed with direct access to sandbox memory and to understand how android allocates memory and works with serialization, concurrency and reflection.
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
Talk of Julik Tarkhanov, senior backend engineer, WeTransfer, Amsterdam, at Ruby Meditation #28 Kyiv 26.10.2019
Next conference - http://www.rubymeditation.com/
It is often a choice, sometimes a whim, and sometimes an act of desperation. We idolise reuse while sometimes the road not taken is just as exciting. Let's chat about where it is appropriate to "do the thing again", take the scenic route and enjoy the view.
Announcements and conference materials https://www.fb.me/RubyMeditation
News https://twitter.com/RubyMeditation
Photos https://www.instagram.com/RubyMeditation
The stream of Ruby conferences (not just ours) https://t.me/RubyMeditation
* The channel of the organizers of the meetup https://t.me/incredevly
Similar to Секреты сборки мусора в Java [DUMP-IT 2012] (20)
This document discusses Java memory usage on Linux systems and how to monitor and troubleshoot Java applications running on Linux. It covers Java memory structures like heap, non-heap memory and thread stacks. It also discusses Linux memory management and key metrics like resident size. The document provides tips on setting up the JVM, tuning network and OS settings. It recommends tools like jstack, jstat and jcmd for diagnosing issues like high CPU usage, leaks or out of memory errors.
The document discusses performance issues that can arise in Java applications and strategies for identifying bottlenecks. It provides an overview of potential causes of slowness at the server, browser, application, and database levels. It also describes various profiling tools like JVisualVM, JProfiler, and SJK ttop that can help analyze thread CPU usage, memory usage, and garbage collection to diagnose specific problems like CPU hogs, thread contention, and full GC pauses. The document provides examples of how to profile applications built with JEE technologies like JBoss, Seam and Hibernate. It also lists JVM options for tuning garbage collection, particularly for the Concurrent Mark Sweep (CMS) and Garbage First (G1
Java profiling Do It Yourself (jug.msk.ru 2016)aragozin
The document discusses various tools and techniques for Java profiling and diagnostics. It describes JVM diagnostic interfaces like JMX and JVMTI, the Attach Protocol, performance counters, and flight recording. It also summarizes tools like SJK and BTrace that provide command line interfaces for profiling, analyzing garbage collection, tracking CPU usage, working with heap dumps, and more. These tools exploit JVM interfaces and allow ad-hoc instrumentation to gather detailed insight into a running JVM.
The document discusses various techniques for profiling Java applications to identify performance bottlenecks, including stack trace sampling, bytecode instrumentation, Java Management Extensions (JMX), flight recording, and tools like SwissJavaKnife. It emphasizes starting with broad profiling before narrowing down on specific problem areas using more advanced tools. Some key points covered are understanding the target problem and performance indicators, avoiding getting sidetracked, and progressing profiling steps slowly and steadily.
What every Java developer should know about network?aragozin
This document summarizes key aspects of TCP networking that every Java developer should know. It covers TCP fundamentals like reliable in-order data transmission, connection establishment through binding and accepting sockets, graceful connection closure, and error handling. It also discusses tuning options like buffer sizes, Nagle's algorithm, and keepalive timeouts. The document explains TCP congestion control mechanisms like slow start and uses diagrams to illustrate concepts like the sliding window and congestion avoidance phases. It also cautions about network hazards that can be simulated for testing.
This document summarizes tools and techniques for Java profiling and diagnostics. It discusses using JMX, JVMTI, and the Attach API to gather information on threading, memory usage, garbage collection, and perform actions like heap dumps. It also introduces the SJK toolkit which provides commands for profiling tasks and the Sigar and BTrace tools. Real-world uses of profiling techniques are presented, like benchmarking and diagnosing production systems. Future ideas proposed include a visual thread analyzer and scripting-based heap dump exploration.
This document discusses various tools for Java profiling and diagnostics including SJK, BTrace, JVM attach API, and perf counters. SJK is a command line tool that exploits JMX, attach API, and perf counters to provide commands for thread profiling, garbage collection analysis, heap dumps, and other diagnostic information. BTrace allows injecting code snippets to perform instrumentation profiling. The JVM attach API can be used to attach to running JVMs and perform operations like heap dumps and stack traces. Perf counters provide low-overhead access to JVM counters via shared memory. The document provides examples and links to documentation for these various Java profiling and diagnostic tools.
JIT compilation in modern platforms – challenges and solutionsaragozin
This document discusses just-in-time (JIT) compilation techniques in modern runtimes. It outlines two main approaches to JIT - method-based compilation and tracing JIT. It then describes specific techniques used in the HotSpot JVM, including its fast interpreter, two-tiered JIT compilation, runtime profiling, devirtualization, incremental compilation, on-stack replacement, escape analysis and scalar replacement. It also discusses how the garbage collector interacts with compiled code.
This document discusses strategies for casual mass parallel data processing using Java. It describes using a simple master-slave topology with a task queue and scheduler to distribute work. The data plane should avoid sending data over RMI and instead use local file systems or in-memory databases. NanoCloud is introduced as a way to drastically simplify coding for computing clusters by allowing remote code execution over SSH.
NanoCloud provides a way to deploy Java applications across multiple servers and nodes in a cloud-like manner using only SSH and Java. It handles classpath replication, remote execution, and bidirectional communication between nodes in a transparent way without heavy infrastructure requirements. The document outlines NanoCloud's capabilities and goals to simplify distributed testing and deployment of Java applications at scale.
This document describes how to virtualize Java applications in Java by hosting multiple "pseudo JVMs" within a single JVM. This allows deploying distributed applications for testing purposes. Key points covered include:
- Using custom classloaders and system properties to isolate "pseudo JVMs" and simulate distributed environments.
- Frameworks like GridKit that enable starting whole application topologies within JUnit tests for behaviors testing.
- Techniques for testing features like serialization, data routing, and cross-version compatibility.
- Later extensions to deploy virtual nodes across real servers using SSH for performance and deployment testing of distributed systems.
Filtering 100M objects in Coherence cache. What can go wrong?aragozin
The document discusses filtering 100 million objects from a Coherence cache. It describes initial problems encountered including out of memory errors and high memory usage. Several strategies are proposed and tested to address these issues including using indexes more efficiently, incremental retrieval of results in batches to control traffic, and implementing basic multi-version concurrency control to provide snapshot consistency for queries.
This document discusses techniques used by just-in-time (JIT) compilers to optimize method calls in dynamic programming languages. It describes how call sites are often monomorphic, calling the same method, and how tracing JITs can exploit this by compiling call sequences into optimized machine code traces. Whole method JITs used in virtual machines like the JVM additionally profile call sites and can devirtualize polymorphic calls. The document outlines challenges for JITs in dynamic languages and techniques used to address these challenges.
- TCP was originally designed with a goal of allowing communication networks to withstand nuclear war through a loose network of interconnected nodes with ad-hoc routing and weak service guarantees.
- While TCP works well for high reliability and in-order delivery over high-latency wide-area networks, it is not optimized for high-performance computing clusters with low-latency infiniband or 10 gigabit ethernet networks.
- Alternatives like TCMP and SCTP were designed for low-latency clustered environments and provide features like message-orientation, multi-streaming, and multi-homing that simplify congestion control compared to TCP.
Coherence SIG: Advanced usage of indexes in coherencearagozin
This document discusses advanced indexing techniques in Oracle Coherence including:
1. How to create indexes on cache attributes using a ValueExtractor and configure index properties like ordering.
2. How filters can utilize indexes through the IndexAwareFilter interface to efficiently filter candidate sets.
3. Examples of using multiple indexes in a single query and compound indexes.
4. Custom index implementations using a custom IndexAwareExtractor to support advanced data structures.
5. Embedding Apache Lucene for full text search capabilities by mapping objects to Lucene documents and executing Lucene queries on the Coherence cache.
2. О чём этот доклад?
• Обзор проблемы автоматического
управления памятью
• Stop-the-world паузы – причины
• Сборка мусора в современных JVM
3. Сборка мусора
Языки использующие автоматическое управление памятью
Java, JavaScript, Erlang, Haskell, Python, PHP, C#, Ruby, Perl,
SmallTalk, OCaml, List, Scala, ML, Go, D, …
… and counting
Языки не использующие автоматическое управление памятью
C, C++, Pascal/Delphi, Objective-C
Что я забыл?
4. Способы сборки мусора
Мусор – структура данных (объект) в памяти не
достижимый из программного кода.
Подсчёт ссылок
Транзитивное замыкание ссылок
Вообще не собирать
5. Подсчёт ссылок
+ Просто
+ Не требует пауз для сбора мусора
– Не очищает циклические графы
– Дополнительные 15-30% нагрузки CPU
– Плохо сочетается с много поточностью
6. Транзитивное замыкание
ссылок
• Корневой набор ссылок
Статические переменные
Локальные переменные
• Объекты достижимые из корневых ссылок – живые
• Объекты недостижимые из корневых ссылок – мусор
В общем случае, граф объектов не должен меняться по мере обхода.
Следовательно, прикладные потоки должны быть остановлены пока
идёт сборка мусора.
7. Алгоритмы сборки мусора
• Mark-Sweep
Фаза 1 – маркировка достижимых объектов
Фаза 2 – “вычистка” мусора
• Copy collector (сборка копированием)
Использует две области памяти, но выполняется в один проход
• Mark-Sweep-Compact
Mark-Sweep + перемещение живых объектов
18. Экономика сборки мусора
S – объём кучи Объём
L – объём живых объектов мусора в куче
Copy collection
SL
Эффективность c
L
Mark-Sweep
SL SL
Эффективность c1 c2
L S
19. Слабая гипотеза о поколениях
Постулаты
Большинство объектов умирают молодыми
Число ссылок на молодые объекты мало
Следствие
Если хранить молодые объекты отдельно от старых, можно
обеспечить высокую пропускную способность (молодое
поколение) и эффективное использование памяти (старое
поколение).
20. Демография объектов в куче
Период молодой сборки
Смертность (байт/с)
Период старой сборки
∞
Возраст объектов
21. Generational collection
Молодое поколение
Сборщик настроен на пропускную способность
Старое поколение
Сборщик настроен на эффективное использование памяти
Продвижение (promotion) объектов в старое поколение
Сборщик молодого поколения копирует живые объекты в
старое поколение после достижения “зрелого” возраста
22. Generational collection
Как получить все указатели из старого
поколения на молодое?
Ответ – барьер на запись
Каждый раз при записи указателя в память в
“старом” пространстве, срабатывает барьер
23. Молодая сборка HotSpot JVM
Eden S1 S2 Tenured
Dirty cards
Collect roots for young GC
Scan stack traces
Scan dirty pages in old space
Сбор “корневых” ссылок
24. Молодая сборка HotSpot JVM
Eden S1 S2 Tenured
Dirty cards
Collect roots for young GC
Clean cards
Recursive copy of live objects (only live objects are traversed)
Копирование живых объектов
25. Молодая сборка HotSpot JVM
Eden S1 S2 Tenured
Dirty cards
Области памяти, не помеченные в таблице карт,
не могут содержать ссылки на молодое поколение
Сборка закончена
26. Stop-the-world паузы
• Изменение графа объектов во время
обхода может привести к пропуску
достижимых объектов
• Большинство managed runtimes может
перемещать объекты только в режиме
паузы
27. Stop-the-world паузы
Параллельные (parallel) алгоритмы
Используют несколько потоков чтобы сократить время пауз
Фоновые (concurrent) алгоритмы
Выполняют большую часть работы в фоновом режиме (без STW пауз)
Инкрементальные алгоритмы
Много маленьких STW вместо одной длительной
28. Фоновая маркировка
Проблема
Граф объектов меняется по мере обхода *
* Даже в функциональных языках могут выполняться
отложенные вычисления, меняющие граф
Решение
барьер на запись – отслеживать ссылки
изменившиеся за время обхода
29. Фоновая маркировка
Card marking write barrier
HotSpot CMS, JRockit, IBM J9
Snapshot-at-the-beginning (SATB) write barrier
HotSpot G1
Альтернатива барьеру на запись – барьер на чтение
Azul Zing JVM
36. SATB барьер записи (G1)
D
GC B
A B C D
Reference ссылок: пусто
Очередь queue: empty
37. “Card marking” барьер записи
[пауза] Сбор корневых ссылок
[фон] Обход графа объектов
[фон] Перемаркирова “грязных” страниц
[паузa] Финальная перемаркирова
38. Перемещение объектов
Большинство JVM не может перемещать объекты
без STW паузы.
Цель – уменьшение длительности пауз
Параллельная обработка (задействовать все ядра)
Инкрементальное уплотнение (чаще, но короче)
Не уплотнять – опасность фрагментации
39. Oracle HotSpot
Однопоточный сборщик мусора
-XX:+UseSerialGC
Молодое поколение:
• Сборка копированием
Старое поколение:
• Mark Sweep Compact
Возвращает неиспользуемую
память ОС после сборки старшего поколения
http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
41. Oracle HotSpot
Фоновый сборщик мусора
-XX:+UseConcMarkSweepGC
Молодое поколение:
• Одно или многопоточная сборка копированием
Старое поколение:
• Фоновая Mark Sweep сборка
Не перемещает объекты в старом поколении при сборке в
фоновом режиме
http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
42. Oracle HotSpot
Фоновый сборщик мусора
-XX:+UseG1GC
Молодое поколение:
• Многопоточная сборка копированием
Старое поколение:
• Инкрементальная многопоточная сборка копированием
Возвращает не используемую память ОС
http://aragozin.blogspot.com/2011/09/hotspot-jvm-garbage-collection-options.html
43. Oracle’s HotSpot JVM
Young collector Old collector JVM option
Serial (DefNew) Serial Mark-Sweep-Compact -XX:+UseSerialGC
Parallel scavenge (PSYoungGen) Serial Mark-Sweep-Compact (PSOldGen) -XX:+UseParallelGC
Parallel scavenge (PSYoungGen) Parallel Mark-Sweep-Compact (ParOldGen) -XX:+UseParallelOldGC
Serial (DefNew) Concurrent Mark Sweep -XX:+UseConcMarkSweepGC
-XX:-UseParNewGC
Parallel (ParNew) Concurrent Mark Sweep -XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
G1 -XX:+UseG1GC
http://blog.ragozin.info/2011/09/hotspot-jvm-garbage-collection-options.html
44. Oracle JRockit
-Xgc: option Generational Mark Sweep/Compact
genconcon or gencon Yes concurrent incremental
singleconcon or singlecon No concurrent incremental
genconpar Yes concurrent parallel
singleconpar No concurrent parallel
genparpar or genpar Yes parallel parallel
singleparpar or singlepar No parallel parallel
genparcon Yes parallel incremental
singleparcon No parallel incremental
http://blog.ragozin.info/2011/07/jrockit-gc-in-action.html
45. IBM J9
-Xgcpolicy:optthruput
Одно поколение, stop-the-world сборщик
-Xgcpolicy:optavgpause
Одно поколение, частично конкурентный сборщик
-Xgcpolicy:gencon
Два поколения, частично конкурентный сборщик
46. Azul Zing
• Два поколения
• Молодое поколение – конкурентный mark-sweep-compact (MSC)
• Старое поколение – конкурентный mark-sweep-compact (MSC)
Azul Zing выполняет перемещение объектов (уплотнение
памяти) без останова приложения. Ни одна из фаз сборки
мусора не требует STW паузы.
Секрет – read barrier (барьер чтения).
47. Масштабируемость JVM
Может ли JVM работать с большим объёмом
памяти (16GiB и более) без “фризов”?
Ответ да, если приложение удовлетворяет
постулатам гипотезы о поколениях.
48. Рецепт работы без пауз
• HotSpot JVM
• CMS (Concurrent Mark Sweep) сборщик мусора
• Тюнинг
Результат
• Паузы не более 150ms на 32GiB кучи
49. HotSpot CMS сборщик
Сборка молодого поколения копированием
Не перемещает объекты в старом поколении
Статистические методы борьбы с фрагментацией
Две дополнительные STW фазы
initial-mark, remark
Вся остальная работа происходит в фоне
50. Длительность пауз CMS сборщика
Initial
Young collection Remark
mark
Scan Copy Scan Scan Scan Scan
thread Scan dirty cards live thread young thread young Scan dirty cards
stacks objects stacks space stacks space
Read Scan Read Scan
card dirty card dirty
table pages table pages
51. CMS и фрагментация памяти
CMS не перемещает объекты в старшем поколении.
CMS использует отдельные списки свободного места (FSL)
для каждого размера выделяемого блока.
Профилактика фрагментации:
• увеличение размера кучи
• более частые циклы сборки
• HotSpot JVM версии 6u26 и старше
52. Советы по настройке CMS
Настройка CMS на большом объёме кучи
• -XX:MaxNewSize= ? – размер молодого поколения
• -XX:CMSWaitDuration= ?
• -XX:-CMSConcurrentMTEnabled – защита от бага в JVM
• -XX:+UseCMSInitiatingOccupancyOnly
• -XX:+CMSClassUnloadingEnabled – если действительно нужно
• -XX:ParGCCardsPerStrideChunk= ? – если куча больше 16 GiB
• JVM 1.6u26 или более поздняя
• плюс логирование GC
53. Другие причины пауз
• Свопинг ОС
• Обработка ссылок (weak, soft, phantom, JNI)
• Объекты требующие “финализации”
• JNI, native код может блокировать GC
• Проблемы с permanent generation
54. HotSpot G1
G1 (Garbage First) – новый алгоритм в
последних версия HotSpot JVM
Решит ли он проблему пауз?
55. Можно лучше – OpenJDK патч
RFE-7068625
http://blog.ragozin.info/2011/07/openjdk-patch-cutting-down-gc-pause.html
56. ИТОГ: Сборка мусора в JVM
Сборка мусора не чёрная магия
Каждое приложение индивидуально
Приложение не должно мешать сборщику мусора
JVM может работать “почти” без пауз
(с паузами не более 100-200ms)
Автоматическое управление памятью не универсально
(Проблемные приложения: HBase, Cassandra, …)
57. Альтернативы
java.nio.ByteBuffer.allocateDirect()
Достоиства
• Память выделяется вне кучи
• Память освобождается автоматически (через ByteBuffer объект)
• Кроссплатформенность, “чистая Java”
Недостатки
• Фрагментация памяти вне кучи
• Память освобождается автоматически (через ByteBuffer объект)
• Усложняет многопоточное программирование
• -XX:MaxDirectMemorySize=<value>
58. Альтернативы
Real Time System Java
Иерархия регионов памяти
• Объекты выделяются в выбранном регионе
• Локальные и “бессмертные” регионы не собираются
• Локальные регионы освобождаются целиком
• Глобальные объекты не могу ссылаться на локальные