diff --git a/.gitignore b/.gitignore
index 8f242ff..38a19dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,9 @@
# Mobile Tools for Java (J2ME)
.mtj.tmp/
+# vim swap files
+*.swp
+
# Package Files #
*.jar
!gradle-wrapper.jar
diff --git a/.gradle/6.3/executionHistory/executionHistory.lock b/.gradle/6.3/executionHistory/executionHistory.lock
deleted file mode 100644
index a7604be..0000000
Binary files a/.gradle/6.3/executionHistory/executionHistory.lock and /dev/null differ
diff --git a/.gradle/6.3/fileChanges/last-build.bin b/.gradle/6.3/fileChanges/last-build.bin
deleted file mode 100644
index f76dd23..0000000
Binary files a/.gradle/6.3/fileChanges/last-build.bin and /dev/null differ
diff --git a/.gradle/6.3/fileHashes/fileHashes.lock b/.gradle/6.3/fileHashes/fileHashes.lock
deleted file mode 100644
index 2b22044..0000000
Binary files a/.gradle/6.3/fileHashes/fileHashes.lock and /dev/null differ
diff --git a/.gradle/6.3/gc.properties b/.gradle/6.3/gc.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/.gradle/6.5/executionHistory/executionHistory.bin b/.gradle/6.5/executionHistory/executionHistory.bin
deleted file mode 100644
index ca60313..0000000
Binary files a/.gradle/6.5/executionHistory/executionHistory.bin and /dev/null differ
diff --git a/.gradle/6.5/executionHistory/executionHistory.lock b/.gradle/6.5/executionHistory/executionHistory.lock
deleted file mode 100644
index 7ae781a..0000000
Binary files a/.gradle/6.5/executionHistory/executionHistory.lock and /dev/null differ
diff --git a/.gradle/6.5/fileChanges/last-build.bin b/.gradle/6.5/fileChanges/last-build.bin
deleted file mode 100644
index f76dd23..0000000
Binary files a/.gradle/6.5/fileChanges/last-build.bin and /dev/null differ
diff --git a/.gradle/6.5/fileHashes/fileHashes.bin b/.gradle/6.5/fileHashes/fileHashes.bin
deleted file mode 100644
index adb536e..0000000
Binary files a/.gradle/6.5/fileHashes/fileHashes.bin and /dev/null differ
diff --git a/.gradle/6.5/fileHashes/fileHashes.lock b/.gradle/6.5/fileHashes/fileHashes.lock
deleted file mode 100644
index b89035b..0000000
Binary files a/.gradle/6.5/fileHashes/fileHashes.lock and /dev/null differ
diff --git a/.gradle/6.5/gc.properties b/.gradle/6.5/gc.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
deleted file mode 100644
index 125640c..0000000
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ
diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties
deleted file mode 100644
index b774acd..0000000
--- a/.gradle/buildOutputCleanup/cache.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-#Thu Oct 08 23:16:29 MSK 2020
-gradle.version=6.3
diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock
deleted file mode 100644
index 2cf264e..0000000
Binary files a/.gradle/checksums/checksums.lock and /dev/null differ
diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 26d3352..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index c8b5c9a..0000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
deleted file mode 100644
index 87ca0fc..0000000
--- a/.idea/gradle.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
deleted file mode 100644
index fdc392f..0000000
--- a/.idea/jarRepositories.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index b0ec460..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index c29a8be..6781205 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,16 @@
-# Примеры для курса "Разработчик Java" в OTUS
+Написать приложение, которое следит за сборками мусора и пишет в лог количество сборок каждого типа (young, old) и время которое ушло на сборки в минуту.
-Группа 2020-09
+Добиться OutOfMemory в этом приложении через медленное подтекание по памяти (например добавлять элементы в List и удалять только половину).
-### Преподаватели
-Сергей Петрелевич
-Стрекалов Павел
-Александр Оруджев
-Вячеслав Лапин
-Виталий Куценко
-Дмитрий Коган
+Настроить приложение (можно добавлять Thread.sleep(...)) так чтобы оно падало с OOM примерно через 5 минут после начала работы.
-Студент:
-Kashapov Renat (Кашапов Ренат)
-renat.kashapov@gmail.com
\ No newline at end of file
+Собрать статистику (количество сборок, время на сборки) по разным GC.
+
+!!! Сделать выводы !!! ЭТО САМАЯ ВАЖНАЯ ЧАСТЬ РАБОТЫ: Какой gc лучше и почему?
+
+Выводы оформить в файле Сonclusions.md в корне папки проекта. Результаты измерений сведите в таблицу.
+
+Попробуйте провести этот эксперимент на небольшом хипе порядка 256Мб, и на максимально возможном, который у вас может быть.
+
+Критерии оценки:
+Система оценки максимально соответсвует привычной школьной: 3 и больше - задание принято (удовлетворительно). ниже - задание возвращается на доработку.
diff --git a/hw04-GCCompare/Conclusions.md b/hw04-GCCompare/Conclusions.md
new file mode 100644
index 0000000..b629bc6
--- /dev/null
+++ b/hw04-GCCompare/Conclusions.md
@@ -0,0 +1,51 @@
+Запсукал тест из командной строки командой:
+
+time java -Xms48m -Xmx48m -Xlog:gc=debug:file=./logs/gc-%p-%t.log:tags,uptime,time,level -XX:+UseParallelGC -cp hw04-GCCompare/build/classes/java/main GCCompare
+
+Получил такие результаты выполнения по времени:
+
+Usage|Serial|Parallel|G1|Z
+---|---|---|---|---
+real|m9.568s|1m42.697s|49m5.777s|24m5.742s
+user|8m3.852s|1m40.046s|48m24.503s|23m43.360s
+sys|0m0.168s|0m0.076s|0m16.451s|0m2.176s
+
+Для логов получил такие результаты:
+
+Parameter|Serial|Parallel|G1|Z
+---|---|---|---|---
+Young (кол-во сборок)|56.267ms (8)|125.543ms (8)|-|-
+Old(Full) (кол-во сборок)|692.647ms (9)|658.036ms (7)|-|-
+Total (кол-во сборок)|749.274ms (17)|783.579ms (15)|-|-
+
+_Для выделяемого объёма памяти 56Мб G1 проработала более 80 минут, после чего программа была прервана. Поэтому сравнение велось на объёме память 48 мб_
+
+Вывод: для Debian с 2 Гб памяти и максимальным возможным значением 494 Мб для HeapSize наиболее производительными будет Parallel.
+
+При использовании Long вместо Date результаты по времени следующие:
+
+Usage|Serial|Parallel|G1|Z
+---|---|---|---|---
+real|4m42.855s|1m45.182s|41m58.634s|18m35.383s
+user|4m40.456s|1m43.557s|41m30.208s|18m24.164s
+sys|0m0.088s|0m0.056s|0m11.325s|0m0.944s
+
+Разница заметна, но не существенная. Однако это натолкнуло меня на наличие взаимосвязи между размером (атомарного) объекта и производительностью программы, обуславливаемой выбором GC.
+В программу были внесены изменения (вместо объектов Long/Date в ArrayList начал заносить различные массивы int), результаты помещены в сводную таблицу (тестирование велось на выделенном объёме 494MB):
+
+Usage|Serial|Parallel|G1|Z
+---|---|---|---|---
+int[256]|21.235s(466607)|10.222s(311071)|29.222s(466607)|122.573s(466607)
+int[128]|43.598s(699911)|42.027s(699911)|99.843s(699911)|346.264s(699911)
+int[64]|346.264s(1574801)|103.634s(1049867)|2008.708s(1574801)|5109.768s(1574801)
+
+Таким образом время работы (на фиксированном выделенном объёме памяти) явно зависит от атомарного размера объекта, хотя мне более объективной видится зависимость от общего числа объектов в программе (в скобках приведены максимальные значения размеров ArrayList перед удалением половины объектов, при которых ещё не был достигнут OOM).
+На моей машине наиболее оптимальным видится использование ParallelGC с точки зрения времени исполнения программы. Другое дело с точки зрения падения или достижения наибольшего числа объектов в ArrayList (по сути качество работы GC). ParallelGC в 2-х случах из 3-х не достиг показателей остальных GC. По совокупности обоих факторов на моей машине лучшим видится SerialGC.
+
+Обработка логов для программы с использованием массивов int[128] (этого размера опытного массива удалось достичь всем GC) отражена в таблице:
+
+Parameter|Serial|Parallel|G1|Z
+---|---|---|---|---
+Young (кол-во сборок)|212.054ms (7)|357.272ms (6)|-|-
+Old(Full) (кол-во сборок)|1497.610ms (10)|1806.858ms (18)|-|-
+Total (кол-во сборок)|1709.664ms (17)|2164.130ms (24)|-|-
\ No newline at end of file
diff --git a/hw04-GCCompare/build.gradle b/hw04-GCCompare/build.gradle
new file mode 100644
index 0000000..5cdc26c
--- /dev/null
+++ b/hw04-GCCompare/build.gradle
@@ -0,0 +1,14 @@
+plugins {
+ id 'java'
+}
+
+group 'ru.otus'
+version '1.0-SNAPSHOT'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ testCompile group: 'junit', name: 'junit', version: '4.12'
+}
diff --git a/hw04-GCCompare/src/main/java/GCCompare.java b/hw04-GCCompare/src/main/java/GCCompare.java
new file mode 100644
index 0000000..3470181
--- /dev/null
+++ b/hw04-GCCompare/src/main/java/GCCompare.java
@@ -0,0 +1,28 @@
+import java.util.ArrayList;
+import java.util.List;
+
+/*
+-Xms48m -Xmx48m -Xlog:gc=debug:file=./logs/gc-%p-%t.log:tags,uptime,time,level -XX:+UseSerialGC
+-XX:+UseSerialGC ()
+-XX:+UseParallelGC
+-XX:+UseG1GC
+-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
+ */
+
+public class GCCompare {
+ static final int ARRAY_SIZE = 64;
+ public static void main(String ... args){
+ List intArrayList = new ArrayList<>();
+ intArrayList.add(new int[ARRAY_SIZE]);
+ while (true){
+ int currentSize = intArrayList.size();
+ System.out.println("currentSize is " + currentSize);
+ for (int i=currentSize-1;i>currentSize/2;i--){
+ intArrayList.remove((int) (Math.random()*intArrayList.size()));
+ }
+ for (int i = 0; i < currentSize; i++) {
+ intArrayList.add(new int[ARRAY_SIZE]);
+ }
+ }
+ }
+}
diff --git a/settings.gradle b/settings.gradle
index 9a32c0b..09480b3 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +1,3 @@
rootProject.name = 'otus_hw'
+include 'hw04-GCCompare'
diff --git a/src/main/java/A.java b/src/main/java/A.java
deleted file mode 100644
index 6be5562..0000000
--- a/src/main/java/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public class A {
- public static void main(String ... args){
- System.out.println("Hello, gradle + git!");
- }
-}