SlideShare a Scribd company logo
1 of 39
Download to read offline
МОНІТОРИНГ ТА
ОПТИМІЗАЦІЯ
JAVA-ЗАСТОСУНКІВ
,@by_mamagaga @anxolerd
21 грудня 2016
ЧАСТИНА 1.
ОГЛЯД ТИПОВИХ ПРОБЛЕМ ТА
СПОСОБІВ ЇХ ОПТИМІЗАЦІЇ
Deadlock — взаємне блокуваня, яке приводить до
зависання програми.
ТИПОВИЙ ПРИКЛАД
class T1 extends Thread {
@Override
public void run() {
// ...
lockA.lock();
lockB.lock();
// Critical section
lockB.unlock();
lockA.unlock();
// ...
}
}
class T2 extends Thread {
@Override
public void run() {
// ...
lockB.lock();
lockA.lock();
// Critical section
lockA.unlock();
lockB.unlock();
// ...
}
}
ЯК БОРОТИСЯ З DEADLOCKS
Ретельно проектувати застосунок
Звертати особливу увагу на взаємодію потоків
ВИТОКИ ПАМ'ЯТІ
Memory leak — процес неконтрольованого зменшення
об'єму пам'яті комп'ютера, пов'язаний з помилками в
програмах, які вчасно не звілняють вже не потрібні
ділянки пам'яті.
СТВОРЕННЯ ОБ'ЄКТІВ У ЦИКЛІ
class InLoopCreator {
public static void main(String[] args){
// ...
for (Object o : collection) {
// Note that a new checker instance
// will be created on each iteration
Checker c = new Checker();
if (c.check(o)) {
process(o);
}
}
// ...
}
}
НЕВИКОРИСТАННЯ ПАТТЕРНІВ
class DwarfNPC {
byte[] texture;
// ...
DwarfNPC() {
// ...
// Note that we load the same texture
// for every single instance
this.texture = FileLoader.load("assets/textures/dwarf");
// ...
}
}
ЗАВАНТАЖЕННЯ УСЬОГО І ОДРАЗУ
class GreedyLoader {
List<World> worlds = new ArrayList<World>();
GreedyLoader() {
// ...
for (String resourceUrl : resourceList) {
World world = World.fromResource(resourceUrl);
worlds.add(world);
}
// ...
}
// Worlds are used sequentially
public World getNextWorld() { /* ... */ }
}
НЕВИВАНТАЖЕННЯ РЕСУРСІВ
class HeavyTaskProcessor {
Resources resources;
void processWithResources() {
resources = load(resources);
// Do processing
}
void processWithoutResources1() {}
void processWithoutResources2() {}
void processWithoutResources3() {}
void processWithoutResources4() {}
// ...
}
ВАЖКІ SQL-ЗАПИТИ
ОЧІКУВАННЯ
-- Easy
SELECT * FROM "user" WHERE id = 42;
-- Normal
SELECT boss.*
FROM "user"
JOIN "user" AS boss ON boss.id = "user".boss_id
WHERE "user".role = 'employee';
РЕАЛЬНІСТЬ
SELECT cl.* FROM client cl
JOIN company ON cl.company_id = cl.id
JOIN service_record sr ON sr.company_id = company.id
JOIN binding_record br ON br.client_id = cl.ud
WHERE br.valid_since < now() - INTERVAL '42 days'
AND (sr.invoice_id IS NULL OR sr.upgrade_invoice_id IS NULL)
AND sr.id IN (SELECT id FROM services WHERE price > 0)
AND NOT EXISTS (
SELECT 1 FROM binding_record br2
WHERE br2.valid_since > br.valid_since
AND br2.client_id = br.client_id
AND br2.status IN (1,2,5,6)
)
СТРАТЕГІЇ ВИРІШЕННЯ
Проходити по базі частинами
Розбити запит на декілька менших
Виконувати фільтрацію на стороні застосунку
Оптимізовувати сам запит
ПРОХОДИТИ ПО БАЗІ ЧАСТИНАМИ
String q = "select * from big_table";
// ...
ResultSet rs = stmt.executeQuery(q);
process(rs);
String q = "select * from big_table limit=? offset=?";
PreparedStatement st = con.prepareStatement(q);
while (true) {
st.setLong(0, limitValue);
st.setLong(1, offsetValue);
ResultSet rs = stmt.executeQuery(q);
if (rs.isBeforeFirst()) { // result is not empty
process(rs);
offsetValue = offsetValue + limitValue;
} else {
break;
}
}
РОЗБИТИ ЗАПИТ НА ДЕКІЛЬКА МЕНШИХ
SELECT * FROM table_name
WHERE
(table_name.column1 = 'group1' and table_name.some_value > 10)
or (
table_name.column1 = 'group2'
and table_name.some_value < 2
and table_name.some_other_value > 13
)
;
-- QUERY 1
SELECT * FROM table_name
WHERE table_name.column1 = 'group1'
AND table_name.some_value > 10;
-- QUERY 2
SELECT * FROM table_name
WHERE table_name.column1 = 'group2'
AND table_name.some_value < 2
AND table_name.some_other_value > 13;
ВИКОНАТИ ФІЛЬТРАЦІЮ НА СТОРОНІ
ЗАСТОСУНКУ
String q = "SELECT * FROM table_name WHERE column1 > 42";
ResultSet rs = conn.executeQuery(q);
List<Entity> alist = parseRs(rs);
for (Entity item : alist) {
if (!someCondition(item)) { continue; }
process(item);
}
ОПТИМІЗУВАТИ ЗАПИТ
Використоувати індекси
UNION ALL замість складних OR
Зменшувати вибірку за допомогою CTE
ЧАСТИНА 2.
МОНІТОРИНГ ЗАСТОСУНКІВ
JMX
Java Management Extensions (JMX) — технологія Java,
що призначена для контролю та керування
застосунками, системними об'єктами, пристроями
(напр. принтерами) та комп'ютерними мережами. Дані
ресурси представляються у вигляді MBean-об'єктів
(Managed Bean)
ДЕМО
JMC
Java Mission Control (JMC) — набір утиліт для
керування, моніторингу та профілювання Java-
застосунків. Входить до складу Oracle JDK з версії 7u40.
Складається із JMX консолі та Java Flight Recorder
ДЕМО
КОРИСНІ ПОСИЛАННЯ
Офіційна сторінка
Демонстрація можливостей JMC
Вступ до Java Mission Control
LOGS (ELK)
Elasticsearch
Logstash
Kibana
ДЕМО
Public Kibana instance
КОРИСНІ ПОСИЛАННЯ
OSDN2016 - TARAS FILIPOV - СОВРЕМЕННЫЕ
СРЕДСТВА АНАЛИЗА ЛОГОВ
Встановлення ELK стеку
JAVA MELODY
https://github.com/javamelody/javamelody/wiki
ДЕМО
ДЯКУЄМО, ЩО
ДОСЛУХАЛИ ДО
КІНЦЯ)
Monitoring and Optimization of Java Applications (Ukrainian)

More Related Content

Similar to Monitoring and Optimization of Java Applications (Ukrainian)

Similar to Monitoring and Optimization of Java Applications (Ukrainian) (15)

"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
 
cpp-2013 #20 Best practices
cpp-2013 #20 Best practicescpp-2013 #20 Best practices
cpp-2013 #20 Best practices
 
V24 com to_net
V24 com to_netV24 com to_net
V24 com to_net
 
сп
спсп
сп
 
Tdd, ти де?
Tdd, ти де?Tdd, ти де?
Tdd, ти де?
 
Тестування при розробці програмного забезпечення. Unit Tests.
Тестування при розробці програмного забезпечення. Unit Tests.Тестування при розробці програмного забезпечення. Unit Tests.
Тестування при розробці програмного забезпечення. Unit Tests.
 
System programing module 2
System programing module 2System programing module 2
System programing module 2
 
пIм метод лаб2112
пIм метод лаб2112пIм метод лаб2112
пIм метод лаб2112
 
JavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basisJavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basis
 
tsql
tsqltsql
tsql
 
Ddd
DddDdd
Ddd
 
"Rethinking Continuous Delivery", Andrii Nasinnyk
"Rethinking Continuous Delivery",  Andrii Nasinnyk"Rethinking Continuous Delivery",  Andrii Nasinnyk
"Rethinking Continuous Delivery", Andrii Nasinnyk
 
L l13
L l13L l13
L l13
 
Анімовані компоненти та навігація
Анімовані компоненти та навігаціяАнімовані компоненти та навігація
Анімовані компоненти та навігація
 
08 Functions
08 Functions08 Functions
08 Functions
 

Monitoring and Optimization of Java Applications (Ukrainian)