diff --git a/.DS_Store b/.DS_Store index 8e1f4b64..723cd2e7 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/garden/ru/.DS_Store b/garden/.DS_Store similarity index 91% rename from garden/ru/.DS_Store rename to garden/.DS_Store index aafae579..5008ddfc 100644 Binary files a/garden/ru/.DS_Store and b/garden/.DS_Store differ diff --git a/garden/ru/.quartz/quartz.config.ts b/garden/ru/.quartz/quartz.config.ts deleted file mode 100644 index e8d00b89..00000000 --- a/garden/ru/.quartz/quartz.config.ts +++ /dev/null @@ -1,93 +0,0 @@ -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/garden/ru/.quartz/quartz.layout.ts b/garden/ru/.quartz/quartz.layout.ts deleted file mode 100644 index b2d11966..00000000 --- a/garden/ru/.quartz/quartz.layout.ts +++ /dev/null @@ -1,76 +0,0 @@ -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/garden/ru/dev/java/gc/Garbage Collector.md b/garden/ru/dev/java/gc/Garbage Collector.md deleted file mode 100644 index f53f3e52..00000000 --- a/garden/ru/dev/java/gc/Garbage Collector.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -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/garden/ru/index.md b/garden/ru/index.md deleted file mode 100644 index fec39b36..00000000 --- a/garden/ru/index.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -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/garden/ru/meta/files/digital-garden.png b/garden/ru/meta/files/digital-garden.png deleted file mode 100644 index 8ec958b2..00000000 Binary files a/garden/ru/meta/files/digital-garden.png and /dev/null differ diff --git a/garden/ru/meta/zero/00 Java разработка.md b/garden/ru/meta/zero/00 Java разработка.md deleted file mode 100644 index 7212487e..00000000 --- a/garden/ru/meta/zero/00 Java разработка.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -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/garden/ru/meta/zero/00 Разработка.md b/garden/ru/meta/zero/00 Разработка.md deleted file mode 100644 index fee1a824..00000000 --- a/garden/ru/meta/zero/00 Разработка.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tags: - - type/zero-link -title: Разработка ---- -- [Java разработка](00%20Java%20разработка.md) \ No newline at end of file