These are slides from the talk which covers basics of Java Applications monitoring and optimization. This talk was given by my friend and me as a part of the "Technologies of Enterprise Applications Development" course assignment on December 21, 2016.
5. ТИПОВИЙ ПРИКЛАД
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();
// ...
}
}
6. ЯК БОРОТИСЯ З DEADLOCKS
Ретельно проектувати застосунок
Звертати особливу увагу на взаємодію потоків
7. ВИТОКИ ПАМ'ЯТІ
Memory leak — процес неконтрольованого зменшення
об'єму пам'яті комп'ютера, пов'язаний з помилками в
програмах, які вчасно не звілняють вже не потрібні
ділянки пам'яті.
8. СТВОРЕННЯ ОБ'ЄКТІВ У ЦИКЛІ
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);
}
}
// ...
}
}
9. НЕВИКОРИСТАННЯ ПАТТЕРНІВ
class DwarfNPC {
byte[] texture;
// ...
DwarfNPC() {
// ...
// Note that we load the same texture
// for every single instance
this.texture = FileLoader.load("assets/textures/dwarf");
// ...
}
}
10. ЗАВАНТАЖЕННЯ УСЬОГО І ОДРАЗУ
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() { /* ... */ }
}
13. ОЧІКУВАННЯ
-- 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';
14. РЕАЛЬНІСТЬ
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)
)
15. СТРАТЕГІЇ ВИРІШЕННЯ
Проходити по базі частинами
Розбити запит на декілька менших
Виконувати фільтрацію на стороні застосунку
Оптимізовувати сам запит
16. ПРОХОДИТИ ПО БАЗІ ЧАСТИНАМИ
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;
}
}
17. РОЗБИТИ ЗАПИТ НА ДЕКІЛЬКА МЕНШИХ
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;
18. ВИКОНАТИ ФІЛЬТРАЦІЮ НА СТОРОНІ
ЗАСТОСУНКУ
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);
}
22. Java Management Extensions (JMX) — технологія Java,
що призначена для контролю та керування
застосунками, системними об'єктами, пристроями
(напр. принтерами) та комп'ютерними мережами. Дані
ресурси представляються у вигляді MBean-об'єктів
(Managed Bean)
28. Java Mission Control (JMC) — набір утиліт для
керування, моніторингу та профілювання Java-
застосунків. Входить до складу Oracle JDK з версії 7u40.
Складається із JMX консолі та Java Flight Recorder