submodule
This commit is contained in:
parent
cd21af4293
commit
db9d699f9a
BIN
garden/ru/.DS_Store → garden/.DS_Store
vendored
BIN
garden/ru/.DS_Store → garden/.DS_Store
vendored
Binary file not shown.
@ -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
|
|
@ -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: [],
|
|
||||||
}
|
|
@ -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:<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
|
|
@ -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
|
|
||||||
> Приветствуются комментарии по теме заметки для улучшения и исправления фактических ошибок. Но ==не стоит указывать на грамматические ошибки или опечатки.== В первую очередь это мои заметки, которые можн
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 551 KiB |
@ -1,8 +0,0 @@
|
|||||||
---
|
|
||||||
tags:
|
|
||||||
- type/zero-link
|
|
||||||
parents:
|
|
||||||
- "[[00 Разработка]]"
|
|
||||||
title: Java разработка
|
|
||||||
---
|
|
||||||
- [Garbage Collector](../../dev/java/gc/Garbage%20Collector.md)
|
|
@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
tags:
|
|
||||||
- type/zero-link
|
|
||||||
title: Разработка
|
|
||||||
---
|
|
||||||
- [Java разработка](00%20Java%20разработка.md)
|
|
Loading…
Reference in New Issue
Block a user