Initial commit

This commit is contained in:
Struchkov Mark 2024-09-02 08:40:46 +03:00
commit ac0c325128
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
8 changed files with 349 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

93
.quartz/quartz.config.ts Normal file
View File

@ -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

76
.quartz/quartz.layout.ts Normal file
View File

@ -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: [],
}

View File

@ -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:<file>`
- `-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

23
index.md Normal file
View File

@ -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
> Приветствуются комментарии по теме заметки для улучшения и исправления фактических ошибок. Но ==не стоит указывать на грамматические ошибки или опечатки.== В первую очередь это мои заметки, которые можн

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 KiB

View File

@ -0,0 +1,8 @@
---
tags:
- type/zero-link
parents:
- "[[00 Разработка]]"
title: Java разработка
---
- [Garbage Collector](../../dev/java/gc/Garbage%20Collector.md)

View File

@ -0,0 +1,6 @@
---
tags:
- type/zero-link
title: Разработка
---
- [Java разработка](00%20Java%20разработка.md)