Initial commit
This commit is contained in:
commit
ac0c325128
93
.quartz/quartz.config.ts
Normal file
93
.quartz/quartz.config.ts
Normal 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
76
.quartz/quartz.layout.ts
Normal 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: [],
|
||||||
|
}
|
143
dev/java/gc/Garbage Collector.md
Normal file
143
dev/java/gc/Garbage Collector.md
Normal 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
23
index.md
Normal 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
|
||||||
|
> Приветствуются комментарии по теме заметки для улучшения и исправления фактических ошибок. Но ==не стоит указывать на грамматические ошибки или опечатки.== В первую очередь это мои заметки, которые можн
|
||||||
|
|
||||||
|
|
BIN
meta/files/digital-garden.png
Normal file
BIN
meta/files/digital-garden.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 551 KiB |
8
meta/zero/00 Java разработка.md
Normal file
8
meta/zero/00 Java разработка.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
tags:
|
||||||
|
- type/zero-link
|
||||||
|
parents:
|
||||||
|
- "[[00 Разработка]]"
|
||||||
|
title: Java разработка
|
||||||
|
---
|
||||||
|
- [Garbage Collector](../../dev/java/gc/Garbage%20Collector.md)
|
6
meta/zero/00 Разработка.md
Normal file
6
meta/zero/00 Разработка.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
tags:
|
||||||
|
- type/zero-link
|
||||||
|
title: Разработка
|
||||||
|
---
|
||||||
|
- [Java разработка](00%20Java%20разработка.md)
|
Loading…
Reference in New Issue
Block a user