commit ac0c3251289929d71d96b209bc33c850aa324673 Author: Struchkov Mark Date: Mon Sep 2 08:40:46 2024 +0300 Initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..96e9bd5e Binary files /dev/null and b/.DS_Store differ diff --git a/.quartz/quartz.config.ts b/.quartz/quartz.config.ts new file mode 100644 index 00000000..e8d00b89 --- /dev/null +++ b/.quartz/quartz.config.ts @@ -0,0 +1,93 @@ +import { QuartzConfig } from "./quartz/cfg" +import * as Plugin from "./quartz/plugins" + +/** + * Quartz 4.0 Configuration + * + * See https://quartz.jzhao.xyz/configuration for more information. + */ +const config: QuartzConfig = { + configuration: { + pageTitle: "🪴 Struchkov's Garden", + enableSPA: false, + enablePopovers: true, + analytics: { + provider: "plausible", + }, + locale: "ru-RU", + baseUrl: "garden.struchkov.dev", + ignorePatterns: ["private", "templates", ".obsidian"], + defaultDateType: "created", + theme: { + fontOrigin: "googleFonts", + cdnCaching: true, + typography: { + header: "Schibsted Grotesk", + body: "Source Sans Pro", + code: "IBM Plex Mono", + }, + colors: { + lightMode: { + light: "#faf8f8", + lightgray: "#e5e5e5", + gray: "#b8b8b8", + darkgray: "#4e4e4e", + dark: "#2b2b2b", + secondary: "#284b63", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)", + textHighlight: "#fff23688", + }, + darkMode: { + light: "#161618", + lightgray: "#393639", + gray: "#646464", + darkgray: "#d4d4d4", + dark: "#ebebec", + secondary: "#7b97aa", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)", + textHighlight: "#b3aa0288", + }, + }, + }, + }, + plugins: { + transformers: [ + Plugin.FrontMatter(), + Plugin.CreatedModifiedDate({ + priority: ["frontmatter", "filesystem"], + }), + Plugin.SyntaxHighlighting({ + theme: { + light: "github-light", + dark: "github-dark", + }, + keepBackground: false, + }), + Plugin.ObsidianFlavoredMarkdown({ enableInHtmlEmbed: false }), + Plugin.GitHubFlavoredMarkdown(), + Plugin.TableOfContents(), + Plugin.CrawlLinks({ markdownLinkResolution: "shortest" }), + Plugin.Description(), + Plugin.Latex({ renderEngine: "katex" }), + ], + filters: [Plugin.RemoveDrafts()], + emitters: [ + Plugin.AliasRedirects(), + Plugin.ComponentResources(), + Plugin.ContentPage(), + Plugin.FolderPage(), + Plugin.TagPage(), + Plugin.ContentIndex({ + enableSiteMap: true, + enableRSS: true, + }), + Plugin.Assets(), + Plugin.Static(), + Plugin.NotFoundPage(), + ], + }, +} + +export default config diff --git a/.quartz/quartz.layout.ts b/.quartz/quartz.layout.ts new file mode 100644 index 00000000..b2d11966 --- /dev/null +++ b/.quartz/quartz.layout.ts @@ -0,0 +1,76 @@ +import { PageLayout, SharedLayout } from "./quartz/cfg" +import * as Component from "./quartz/components" + +// components shared across all pages +export const sharedPageComponents: SharedLayout = { + head: Component.Head(), + header: [], + afterBody: [], + footer: Component.Footer({ + links: { + "B.log": "https://struchkov.dev" + }, + }), +} + +// components for pages that display a single page (e.g. a single note) +export const defaultContentPageLayout: PageLayout = { + beforeBody: [ + Component.Breadcrumbs(), + Component.ArticleTitle(), + Component.ContentMeta(), + Component.TagList(), + ], + left: [ + Component.PageTitle(), + Component.MobileOnly(Component.Spacer()), + Component.Search(), + Component.Darkmode(), + Component.DesktopOnly(Component.Explorer()), + ], + right: [ + Component.Graph({ + localGraph: { + drag: true, // whether to allow panning the view around + zoom: true, // whether to allow zooming in and out + depth: 1, // how many hops of notes to display + scale: 1.1, // default view scale + repelForce: 0.5, // how much nodes should repel each other + centerForce: 0.3, // how much force to use when trying to center the nodes + linkDistance: 30, // how long should the links be by default? + fontSize: 0.3, // what size should the node labels be? + opacityScale: 1, // how quickly do we fade out the labels when zooming out? + removeTags: [], // what tags to remove from the graph + showTags: true, // whether to show tags in the graph + }, + globalGraph: { + drag: true, + zoom: true, + depth: -1, + scale: 0.9, + repelForce: 0.5, + centerForce: 0.3, + linkDistance: 30, + fontSize: 0.3, + opacityScale: 1, + removeTags: [], // what tags to remove from the graph + showTags: true, // whether to show tags in the graph + }, +}), + Component.DesktopOnly(Component.TableOfContents()), + Component.Backlinks(), + ], +} + +// components for pages that display lists of pages (e.g. tags or folders) +export const defaultListPageLayout: PageLayout = { + beforeBody: [Component.Breadcrumbs(), Component.ArticleTitle(), Component.ContentMeta()], + left: [ + Component.PageTitle(), + Component.MobileOnly(Component.Spacer()), + Component.Search(), + Component.Darkmode(), + Component.DesktopOnly(Component.Explorer()), + ], + right: [], +} diff --git a/dev/java/gc/Garbage Collector.md b/dev/java/gc/Garbage Collector.md new file mode 100644 index 00000000..f53f3e52 --- /dev/null +++ b/dev/java/gc/Garbage Collector.md @@ -0,0 +1,143 @@ +--- +aliases: + - сборщик мусора + - GC + - сборка мусора + - сборки мусора + - сборщику мусора +tags: + - зрелость/🌿 +zero-link: + - "[[../../../meta/zero/00 Java разработка|00 Java разработка]]" +parents: +linked: +date: 2023-11-06 +--- +В некоторых языках есть механизм автоматического и безопасного освобождения оперативной памяти, ранее выделенной объектам в программе. Влияние разработчика на этот процесс опосредованное, прямого управления нет. Этот механизм принято называть Garbage collector (GC). + +> [!WARNING] Структура памяти в Java +> Перед изучением данной темы необходимо понимать, как устроена память в Java. + +Некоторые языки возлагают ответственность за управление памятью на разработчика, например C, C++, Rust. В таком случае разработчик должен сам, в коде, вызвать метод удаления объекта, чтобы освобождать память. Если этого не делать, то можно получить [[утечку памяти]]. + +Наличие GC в языке можно сравнить с коробкой автомат в автомобиле: вы получаете удобство, но в какой-то степени теряете контроль. + +Вы получаете следующие преимущества: +- Ускорение разработки. +- Защита от утечек памяти. + +B следующие недостатки: +- Потребление дополнительных вычислительных ресурсов. +- Утечки памяти :) +- [StopTheWorld](StopTheWorld.md) + +> [!NOTE]- Шуточная молитва сборщиков мусора +> Дай мне места для размещения того, что пока еще нужно. Дай мне смелости удалить то, что больше не пригодится. И дай мне мудрости, чтобы отличить одно от другого. +## Производительность GC +Вам быстро, дешево или качественно? +- **Throughput.** Объем вычислительных ресурсов CPU, затрачиваемых на работу GC. +- **Предсказуемость.** На какое время прерывается работа приложения. +- **Footprint.** Объем используемой памяти. +## Работа GC +Глобально у GC есть всего 2 задачи: +- Найти мусор. То есть понять, что объект больше не будет использоваться. +- И собрать мусор. Уничтожить такие объекты, чтобы на их месте можно было алоцировать новые. + +> [!NOTE] +> В процессе своей работы GC не потребляет память в [[Heap]] +### Алгоритмы поиска мусора +#### Reference Counting +Этот алгоритм подсчитывает количество ссылок на каждый объект. Когда счетчик ссылок достигает нуля, объект считается недоступным. + +Есть довольно много ситуаций, когда данный способ не работает. Например, циклический граф, где объекты ссылаются друг на друга, но они все являются мусором. + +#### Tracing +Подсчет ссылок. Это наиболее распространенный алгоритм маркировки. Он начинается с изначально достижимых, "корневых" (GC Root), объектов и отслеживает все объекты, доступные от этих корней. + +> [!QUESTION] Что может быть выбрано в качестве GC Root? +> Локальные переменные и статические переменные в Main классе и main методе, поток, который выполняет main, статические переменные, ссылки из JNI. +^gcroot +### Подходы к сбору мусора +- [StopTheWorld](StopTheWorld.md) +- [Copy Collector](Copy%20Collector.md) +- [Mark and Sweep](Mark%20and%20Sweep.md) +- [Mark and Compact](Mark%20and%20Compact.md) +- [Generational Collection](Generational%20Collection.md) +- [Incremental Collection](Incremental%20Collection.md) +- [Parallel Collection](Parallel%20Collection.md) +- [Concurrent Collection](Concurrent%20Collection.md) + +### Потоки GC +#### Search thread +- Отдельный поток, который занимается поиском мусора и подает сигнал для запуска сборки. +- Как правило он один и работает параллельно с основной программой. +#### GC thread +- Отдельный поток, который занимается сборкой мусора. +- Таких потоков может быть много. +- Имеет несколько причин для старта. +- Может быть причиной StopTheWorld +### Причины старта GC +Главные: +- **Allocation Failure.** JVM попыталась выделить область памяти под новый объект, но памяти не хватило +- **GC Locker.** Кто-то подал сигнал на уборку. + +Остальные: +- **Adaptive Size Ergonomics.** +- **Allocation Profiler.** Профайлер оказывает влияние на сборку мусора искажая показатели. +- **Heap Inspection.** +- **Heap Dump.** +- **No GC.** Если сборка мусора еще не запускалась или проходила давольно давно. +- **Last Ditch Collection.** +- **Perm Generation Ful.** +- **Meradata GC Threshold.** + +### Minor Collection +^minor + +Если количество используемой Eden Space памяти превышает некоторый заданный объем, то GC может выполнить быструю (minor) сборку мусора. По сравнению с полной сборкой мусора, данный процесс занимает немного времени и затрагивает только область молодого поколения, - устаревшие объекты без ссылок удаляются, а выжившие перемещаются в Survivor Space. + +### Full Collection +В отличии от minor сборок охватывает весь Heap и занимает больше времени. +### Сборщики +- [Epsilon GC](Epsilon%20GC.md). Не собирает мусор :) +- [Serial GC](Serial%20GC.md). Морально устарел, но подойдет для консольных приложений. +- [Parallel GC](Parallel%20GC.md). Подходит для всех остальных случаев. +- [Parallel Compacting Collector](Parallel%20Compacting%20Collector.md). +- [Concurrent Mark Sweep](Concurrent%20Mark%20Sweep.md). Минимизирует время простоя в приложениях с долгоживущими данными. Подходит для web-приложений. +- [Garbage First](Garbage%20First.md). Хорошо подходит для больших объемов памяти в сочетании с небольшими объектами. +- Ultra-low latency + - [ZGC](ZGC.md) + - [Shenandoah GC](Shenandoah%20GC.md) + +По умолчанию обычно используется или [Serial](Serial%20GC.md) или [Parallel GC](Parallel%20GC.md). + +![](Pasted%20image%2020231108140632.png) +## Как повлиять на сборку? +- Писать код с учетом особенностей работы GC. Неблагодарный труд. +- Использовать флаги JVM + +Команда `System.gc()` носит рекомендательный характер. Разработчик рекомендует JVM запустить GC, но JVM может этого и не сделать. +## Мониторинг работы GC +Минимальные накладные расходы + +Параметры VM +- `-XX:+PrintGCDetails -XX:+PrintGCTimeStamps` +- `-Xlog:gc` Показывает время [StopTheWorld](StopTheWorld.md). + - Стоит помнить про [Safe Point](Safe%20Point.md). Этот параметр показывает время без учета накладных расходов. +- `-Xlog:safepoint`. Показывает время с накладными расходами. +- `-Xloggc:` +- `-XX:+PrintGcDateStamps` +- `-XX:+PrintHeapAtGC` +- `-XX:+PrintTenuringDistribution` + +Анализ диагностического вывода: +- PrintGCStats +- GChisto +- VisualVM / VisualGC +## Дополнительные материалы +1. [Сборка мусора в Java](https://www.youtube.com/watch?v=St6iBm4sHl8). + 1. В общих чертах о сборке мусора. +2. [Алексей Шипилёв — Shenandoah](https://www.youtube.com/watch?v=kKigibHrV5I). + 1. Подробно рассказаны алгоритмы маркировки и копирования объектов. +3. [Заметки Гусев Влад](Garbage%20Collection.docx) +4. Есть какая-то книга GC Handbook diff --git a/index.md b/index.md new file mode 100644 index 00000000..fec39b36 --- /dev/null +++ b/index.md @@ -0,0 +1,23 @@ +--- +date: + - - 2024-09-01 +title: Struchkov's Digital Garden +--- +👋 Привет! + +Я Стручков Марк, и это мой "цифровой сад" — место, где я собираю свои мысли, идеи, проекты и вдохновение. +## 🍃 Что такое Цифровой Сад? +Стоит сразу прояснить, что цифровой сад это не блог. Это особый формат ведения заметок и записей в интернете. В отличие от традиционного блога, он не следует строгой хронологии и не стремится к идеальному завершению каждой записи. Представьте себе место, где идеи могут расти, пересекаться и менять направление. Записи здесь — это как маленькие растения, которые можно пересаживать, подкармливать и наблюдать, как они со временем изменяются. + +Основная идея цифрового сада — это процесс, а не результат. Здесь можно увидеть черновики мыслей, промежуточные этапы работы над проектами и идеи, которые ещё только ждут своего часа. Всё связано между собой гипер-ссылками, создавая сеть знаний, которую можно изучать и расширять. + +![digital-garden](meta/files/digital-garden.png) + +## Zero Links +- [Разработка](meta/zero/00%20Разработка.md) + - [Java разработка](meta/zero/00%20Java%20разработка.md) +## Чего стоит избегать +> [!WARNING] DISCLAMER +> Приветствуются комментарии по теме заметки для улучшения и исправления фактических ошибок. Но ==не стоит указывать на грамматические ошибки или опечатки.== В первую очередь это мои заметки, которые можн + + diff --git a/meta/files/digital-garden.png b/meta/files/digital-garden.png new file mode 100644 index 00000000..8ec958b2 Binary files /dev/null and b/meta/files/digital-garden.png differ diff --git a/meta/zero/00 Java разработка.md b/meta/zero/00 Java разработка.md new file mode 100644 index 00000000..7212487e --- /dev/null +++ b/meta/zero/00 Java разработка.md @@ -0,0 +1,8 @@ +--- +tags: + - type/zero-link +parents: + - "[[00 Разработка]]" +title: Java разработка +--- +- [Garbage Collector](../../dev/java/gc/Garbage%20Collector.md) \ No newline at end of file diff --git a/meta/zero/00 Разработка.md b/meta/zero/00 Разработка.md new file mode 100644 index 00000000..fee1a824 --- /dev/null +++ b/meta/zero/00 Разработка.md @@ -0,0 +1,6 @@ +--- +tags: + - type/zero-link +title: Разработка +--- +- [Java разработка](00%20Java%20разработка.md) \ No newline at end of file