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