SlideShare uma empresa Scribd logo
1 de 121
Baixar para ler offline
Занимательные истории из
жизни технической
поддержки JVM
Никита Липский, Excelsior LLC, @pjBooms
Михаил Быков, Oracle Corporation
The preceding is intended to outline our general product direction. It is intended
for information purposes only, and may not be incorporated into any contract.
It is not a commitment to deliver any material, code, or functionality, and should
not be relied upon in making purchasing decisions. The development, release,
and timing of any features or functionality described for Oracle’s products
remains at the sole discretion of Oracle.

2

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Краткое содержание
 Последствия игнорирования Java спецификации
 Проблемы в многопоточных программах

 Ошибки программирования на С и JNI
 Мистические развалы JVM
 Проблемы управления памятью

3

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Кто я? Где я работаю?
Чем занимаюсь?
Как я познакомился с
Никитой и Excelsior JET?

4

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Oracle Solution Support Center (SSC)
DEDICATED
SUPPORT
TEAM
ORACLE
TECHNICAL
ACCOUNT
MANAGER

• Local / Onsite & Assigned to Customer
• Customer Single Point of Contact for Support
Issues
• Escalation Management
• Proactive Support Reviews

PRIORITY
SERVICE
REQUEST
HANDLING

• Faster Service Request response times
• Prioritization of Service Requests in
Support work queue
• Escalations of Service Requests to Duty
Managers based on elapsed time

PREVENTIVE
SERVICES

5

• 24X7 Dedicated Hotline & Immediate Response
• Intimate Knowledge of Customer Business &
Environments
• Onsite & Remote Support Engineers
• Root Cause & Corrective Action Plans

• Preventive advice delivered based on
specific Customer Knowledge
• Advanced Diagnostic Tools providing
Actionable Recommendations
• Patching, Configuration & Product Use
Guidance

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.

BENEFIT
Increase Availability

Improve Performance &
Reliability

Reduce Risk

Reduce Operational Cost
SSC Delivery Model – Standard
Oracle Customer Support Relationship Management

Customer
Management
Team

Customer Service Management Team
Delivery Team

ACS Relationship Management and Delivery Coordination

Support Delivery Management Team
Root Cause Analysis and Proactive Oracle Software Advice

Systems
Architects

Performance Assessments and Other SSC Deliverables

Solution Support Center (SSC)

• Technical Lead
• Focused Engineering Team

Project
Teams

(Business Critical Issues on Covered Environments)
(Phone Call via Dedicated Toll Free Number)

• Reactive/Proactive Coverage

Production
Support

Incident Resolution Assistance

• 8x5 in Customer Time Zone

Service Requests
Standard SSC CSI
CSI

(Sev1s, Sev2s as well as any Project Specific Queries)

• (US and India)

Regular Business Hours

Non Business Hours
(Sev1s on Covered Environments)

• NA SSC After Hours Staff
• 24x7x365 Coverage
• Specialized in Production Support

GCS SR
Algorithm

Oracle Global Customer Support Operations
(24x7x365 Operation)

6

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.

• HUB
• Transfer Coordinators
• Product Analysts

Bugs
and
Defects

Sustaining
Engineering
and Product
Development
Что такое JLE?
Java Licensee Engineering

 Коммерческая реализация исходного кода Java
 Лицензирование кода: клиенты имеют право использовать

название Java в своих продуктах
 Помощь клиентам в прохождении JCK тестирования
 Поддержка переноса JVM на различные платформы
 Excelsior JET и многое другое

7

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Что такое Excelsior JET?

8
Мы не покупали самолетов!

9
Что такое Excelsior JET?
 Полная реализация Java SE
–

c 2005 года cертифицирована как Java Compatible

 AOT compiler + Java Runtime
– смешанная компиляция: AOT + JIT
– поддержка нестандартных загрузчиков классов в AOT режиме (для Eclipse RCP,

Tomcat)

 Toolkit
– Startup Optimizer
– Deployment

10
Клиенты Excelsior JET

11
Служба поддержки Excelsior
 На связи всегда ключевые инженеры команды разработки
 Пользователи, которые только пробуют продукт, обслуживаются

также как купившие его
 "If anyone would have a support like that, there would be much less

problems."
Christian Kellner of Technotrans AG

12
Веселые истории
экран расскажет наш
…

13
Где наша кофеварка?

14
Спецификация Java

15
16
Письмо в техподдержку:
Клиент: Под Excelsior JET не работает
приложение, при этом оно работает на
HotSpot.

17
Письмо в техподдержку:
Клиент: Под Excelsior JET не работает
приложение, при этом оно работает на
HotSpot.
Саппорт: Можете прислать
приложение или пример?

18
Письмо в техподдержку:
Клиент: Под Excelsior JET не работает
приложение, при этом оно работает на
HotSpot.
Саппорт: Можете прислать
приложение или пример?
Клиент: ...Хм.. Мне надо
посоветоваться с начальством!

19
Клиент: Вот приложение!
Саппорт: Большое спасибо, скоро
починим!

20
И действительно не работает…
Приложение бросает исключение
com.thoughtworks.xstream.converters.reflection.ObjectAccessException:
Invalid final field xmltest.Main.theValue

У нас проблемы с Reflection?
У нас проблемы с проверками доступа?

21
Разбираемся и вот …
Какой интересный код!
private boolean canUseSun14ReflectionProvider(){
return (isSun() || isApple() || isHPUX() || isIBM() ||

isBlackdown()) && is14() &&
loadClass("sun.misc.Unsafe") != null;
}

22
Разбираемся и вот …
Какой интересный код!
private boolean canUseSun14ReflectionProvider(){
return (isSun() || isApple() || isHPUX() || isIBM() ||

isBlackdown()) && is14() &&
loadClass("sun.misc.Unsafe") != null;
}

В этом списке нет Excelsior

23
Разбираемся и вот …
Какой интересный код!
private boolean canUseSun14ReflectionProvider(){
return (isSun() || isApple() || isHPUX() || isIBM() ||

isBlackdown()) && is14() &&
loadClass("sun.misc.Unsafe") != null;
}

В этом списке нет Excelsior и … Oracle.

24
private boolean isSun(){
return System.getProperty(“java.vm.vendor”).startsWith(“Sun”);
}

25
Как мы решили проблему
Системное свойство java.vm.vendor теперь выдает …

Sun-Oracle Java SE licensee Excelsior LLC

26
Как мы решили проблему
Системное свойство java.vm.vendor теперь выдает …

Sun-Oracle Java SE licensee Excelsior LLC
Плохая (хорошая) новость: приложения использующие старую
версию XStream не работают на Java 7 , потому что java.vm.vendor
в HotSpot для Java 7 ….

“Oracle Corporation”
27
Сломанный Eclipse

28
С выходом Java

6 Update 21

Eclipse перестал стартовать
с OutOfMemoryError

29

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Причина:
В version info java.dll COMPANY_NAME
поменяли с Sun Microsystems,
на Oracle Corporation

30

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Порядок полей/методов
классов

31

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Очередная версия JBoss
перестала работать на
Excelsior JET

32
Очередная версия JBoss
перестала работать на
Excelsior JET
… и на других JVM кроме
HotSpot

33
Причина: код JBoss ожидал, что
порядок конструкторов , который
возвращает

Class.getDeclaredConstructors()

будет определенным

34
Но:

Java спецификация для методов
getDeclaredFields,
getDeclaredMethods,
getDeclaredContructors
гласит:
“

The elements in the array returned
are not sorted and are not in any
particular order.
“
35
Но давайте попробуем угадать порядок
Рассмотрим пример:
import java.lang.reflect.*;

class Test{
Test()

{}

Test(Object o) {}
Test(String s) {}
public static void main(String args[]){
for (Constructor c: Test.class.getDeclaredConstructors())
System.out.println(c);
}

}

36
Его вывод:
Test()
Test(java.lang.Object)
Test(java.lang.String)

Может конструкторы возвращаются в порядке
объявленном в исходном коде?

37
Добавляем методы:
void dont() {}
void rely() {}
void on

() {}

void it

() {}

И программа теперь выводит:
Test(java.lang.String)
Test(java.lang.Object)

Test()

38
Как насчет порядка полей?
Популярная библиотека JNA, по умолчанию рассчитывает, что порядок полей,
который возвращает метод getDeclaredFields будет тем же, что и в исходном коде.

Что делать, если JVM возвращает его в другом порядке:
Начиная с JNA 3.0 можно переопределить метод

setFieldOrder
В котором задать порядок полей

39
Как насчет порядка методов?

Однажды на тесты Eclipse стали приходить баги такого рода:
JDK-7052494 - Eclipse test fails on JDK 7 b142
JDK-7022327 - java.lang.NullPointerException in org.eclipse.pde.api.tools.tests package

В чем же тут дело?

40

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Тесты иногда падают, и только с JDK7
Проблемы с порядком возвращения методов
Рассмотрим пример:
class Genius

{

public void getGeek() { ... }
public void getNerd() { ...}
}

Один вызов Genius.class.getMethods() может вернуть [ getGeek, getNerd ] а другой такой же вызов
вернет [ getNerd, getGeek ].
В Java SE 6 и до билда 128 в Java SE 7 методы возвращались в определенном порядке!

41

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Что еще может не работать?

 Может не быть <JRE>/bin/java (и других файлов внутри JRE)

 Может не быть класс файлов для вашего приложения во время

исполнения
– Может не работать getProtectionDomain().getCodeSource()

 Сообщения стандартных исключений могут отличаться на разных

JVM
…

42
Что еще может не работать?

 Может не быть <JRE>/bin/java (и других файлов внутри JRE)

 Может не быть класс файлов для вашего приложения во время

исполнения
– Может не работать getProtectionDomain().getCodeSource()

 Сообщения стандартных исключений могут отличаться на разных

JVM
 Горячая новость! В Java 9 закроют доступ к пакету sun!

43
Проблемы в
многопоточных
программах

44
Типичная проблема
public static boolean changed = false;
Thread 1

Thread 2

while (!changed) {
…
sleep(1000);
}

…
changed = true;
…

Что не так с этой программой?
“Thread 1”останавливается?
45
Решение
public static volatile boolean changed = false;
Thread 1

Thread 2

while (!changed) {
…
sleep(1000);
}

…
changed = true;
…

И помните про JMM!
46
Гонки, тупики…
которые “не проявляются"

47
Пример
 SpecJVM 2008 mpegaudio
package javazoom.jl.decoder;
class LayerIIIDecoder {
private static int reorder_table[][];
public LayerIIIDecoder() {
if(reorder_table == null)
{
reorder_table = new int[9][];
for(int j = 0; j < 9; j++)

reorder_table[j] = reorder(sfBandIndex[j].s);
}
}
…
}
48
Пример
 SpecJVM 2008 mpegaudio
Далее,
В методе reorder(float af[][], int i, int j) случается доступ

int i4 = reorder_table[sfreq][l1];
и, как следствие, NPE (если в это время другой поток все еще продолжает инициализировать
reorder_table).
Stack trace:
java.lang.NullPointerException
at javazoom.jl.decoder.LayerIIIDecoder.reorder(Unknown Source)
at javazoom.jl.decoder.LayerIIIDecoder.decode(Unknown Source)
at javazoom.jl.decoder.LayerIIIDecoder.decodeFrame(Unknown Source)
at javazoom.jl.decoder.Decoder.<unknown>(Unknown Source)
49
Почему не проявляется на HotSpot?

По чистой случайности!
 на старте код как правило интерпретируется и многие гонки и

тупики могут не проявить себя в “медленном" исполнении.
 С опциями -server -Xcomp –Xbatch проявляется

50
Проблемы только на
стороне прикладных
программистов?

51
Звонок в Саппорт:
Клиент: У наших инженеров виснет
Java приложение. Но это происходит
не всегда, только периодически.
Можете помочь?

52

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Звонок в Саппорт:
Клиент: У наших инженеров виснет
Java приложение. Но это происходит
не всегда, только периодически.
Можете помочь?
Саппорт: Попробуем, тест кейс есть?

53

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Звонок в Саппорт:
Клиент: У наших инженеров виснет
Java приложение. Но это происходит
не всегда, только периодически.
Можете помочь?
Саппорт: Попробуем, тест кейс есть?
Клиент: Нет, и сделать мы его не
можем!

54

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Виснет, но только иногда!
Посмотрим, что мы имеем…
The customer application was hanging at the Runtime.exec function call. They found lots
of RUNNABLE threads after a JVM thread dump like:
"Thread-719616" prio=3 tid=0x00b4f800 nid=0xe9aea runnable [0x94dff000]
java.lang.Thread.State: RUNNABLE
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:53)

at java.lang.ProcessImpl.start(ProcessImpl.java:65)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
at java.lang.Runtime.exec(Runtime.java:593)
at java.lang.Runtime.exec(Runtime.java:431)

at java.lang.Runtime.exec(Runtime.java:328)

55

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
А что Гугл нам выдаeт?
Много интересного?

56

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Были ли похожие баги?
Да были, но ничего подходящего
 Мы нашли несколько багов на эту тему. Самый последний JDK-

6671051, исправлен в JDK7 build 25.
 Относящиеся к похожей проблеме баги в Solaris были давно
исправлены.
 Инженеры иногда сталкивались с подобным случаем, но ни у кого
не было примера, воспроизводящего проблему.
Похоже, это что-то новое!

57

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Что мы имеем в логах?
Очень много потоков в одном и том же состоянии
Many RUNNABLE threads stuck at
java.lang.UNIXProcess.forkAndExec(Native Method) and the
corresponding lwp in state like
----------------- lwp# 957183 / thread# 957183 --------------------

ff24aa68 lwp_park (0, 0, 0)
ff23c6a4 fork

(1, 0, 0, 0, ff2c79a0, 992a9200) + b8

fe25a3a8 startChild (44e9e8, fdf, fdf, fe278000, 1dc6c, fdc) + 18
fe25a6b8 Java_java_lang_UNIXProcess_forkAndExec (44bd28, fd8, 44e9e8,

940ff65c, fd9, 0) + 2b4
----------------58

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Когда вызывается Runtime.exec?
Во многих местах… и запускает различные команды
 cksum

 sudo
 /usr/bin/pgrep –x “process name”
 String[] command = {"sh", "-c", "grep ce1 " + hosts + " |grep –v

somehost | tr -s 't' ' ' | tr -s ' ' ' ' | egrep -v "^#" | cut -d' ' -f1 | head -1"};
ExternalCommandExecutor executor = new
ExternalCommandExecutor(command);

59

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Картина маслом!
Проблема ли это в JVM?
Имеем у клиента:
 Гигабайтный java процесс
 >5700 потоков, и они периодически запускают внешние процессы с
помощью java/util/TimerThread.run()
 UNIXProcess.forkAndExec() с системным вызовом fork(), который
не возвращает ничего.

А почему так происходит?
60

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Что там в core файле?
Напускаем gcore на повисший процесс и смотрим в core file через
dbx…
(dbx) thread t@213
t@213 (l@213) stopped in __lwp_park at 0xff27ac78
0xff27ac78: __lwp_park+0x0010: ta

%icc,0x00000008

(dbx) thread -blockedby
Thread t@213 is blocked by:
0x01046c30 (0x1046c30): thread mutex(locked)
Lock owned by t@213

61

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Что скажет stack trace?
(dbx) where
current thread: t@213
=>[1] __lwp_park(0x0, 0x0, 0x0, 0x0, 0xff3f6950, 0x1), at 0xff27ac78
[2] mutex_lock_queue(0xc9a5a200, 0x0, 0x1046c30, 0x0, 0x1c00, 0x1d3c), at
0xff272fd8
[3] soft_acquire_all_session_mutexes(0x0, 0x0, 0x1046b00, 0x0, 0xcc3c70b8,
0x1cc7488), at 0xcc36c8f4
[4] softtoken_fork_prepare(0xcc3c7090, 0x1, 0x0, 0xcc3c4000, 0x5d8b0,

0xcc3c4a34), at 0xcc3667ac
[5] _prefork_handler(0x1d18, 0xff2f7940, 0x1c00, 0x0, 0xff2f79a0, 0x0), at
0xff1f3640
[6] _fork1(0x1, 0xffffffff, 0x0, 0x0, 0xff2f79a0, 0xc9a5a200), at
0xff26c8cc
[7] Java_java_lang_UNIXProcess_forkAndExec(0x1b33128, 0x0, 0xc7d5f588,
0xc7d5f584, 0xffffffff, 0x0), at 0xfdf797c0
...
62

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Анализируем Java Process
Смотрим адрес в pmap или в dbx
soft_acquire_all_session_mutexes (0xcc36c8f4)
принадлежит к
pkcs11_softtoken_extra.so.1:
CC360000

320K r-x-- /usr/lib/security/pkcs11_softtoken_extra.so.1

CC3B0000

16K r-x-- /usr/lib/security/pkcs11_softtoken_extra.so.1

А это библиотека из Solaris, и в ней deadlock!

63

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Проблема не в JVM!
Какие рекомендации дать клиенту?
Использовать другую security provider library, но только не pkcs11,

или добавить следующий параметр в java строчку при запуске:

-Dsun.security.pkcs11.enable-solaris=false
Breaking News:
Команда Solaris security сообщила, что этот баг в pkcs11 должен быть уже
исправлен начиная с Solaris 10 Update 11.
64

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Звонок клиенту:
Саппорт: Рекомендации выслали!

65

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Звонок клиенту:
Саппорт: Рекомендации выслали!
Клиент: Спасибо, мы вставили опцию в
Java строку и все работает!

66

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Звонок клиенту:
Саппорт: Рекомендации выслали!
Клиент: Спасибо, мы вставили опцию в
Java строку и все работает!

Это был пример случая, где проблема
в OS библиотеке, а не в JVM.

67

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Другие проблемы в OS, hardware

 Win API вызов GetThreadContext на WOW64 может возвращать

устаревший (не актуальный) контекст
https://connect.microsoft.com/VisualStudio/feedback/details/621594/getthreadcontext-may-return-stale-contents-from-previous-call-out-to-long-mode

 Этот вызов используется GC при сканировании стэка
 В результате, могут удаляться живые объекты доступные со стэка
 А бывают еще проблемы в “железе” …

68
JNI – как лучший способ
разломать JVM

69
Как разломать JVM?
Очень просто
public class JVMCrash {
public static native void main(String[] args);
static {
System.loadLibrary("JVMCrash");
}
}
JNIEXPORT void JNICALL Java_JVMCrash_main(JNIEnv * env, jclass class, jobjectArray args)
{
printf("%sn“, ((char *)args)[0]);
}

70
Кто найдет больше ошибок?

JNIEXPORT void JNICALL Java_JVMCrash_main(JNIEnv * env, jclass class, jobjectArray args)
{

printf("%sn“,((char *)args)[0]);
}

71
Запускаем и получаем …
#
# A fatal error has been detected by the Java Runtime Environment:

#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7727d193, pid=2852, tid=3572
#
# JRE version: 6.0_29-b11
# Java VM: Java HotSpot(TM) Client VM (20.4-b02 mixed mode, sharing windows-x86 )
# Problematic frame:

# C [msvcrt.dll+0xd193]
#
# An error report file with more information is saved as:
# C:workkitsupporttaleshs_err_pid2852.log
#
#

If you would like to submit a bug report, please visit:

# http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.

72
Письмо в техподдержку:
Клиент: Помогите, у нас сломался
принтер, тираж горит!!!

73
Письмо в техподдержку:
Клиент: Помогите, у нас сломался
принтер, тираж горит!!!
Саппорт: А мы здесь причем?

74
Письмо в техподдержку:
Клиент: Помогите, у нас сломался
принтер, тираж горит!!!
Саппорт: А мы здесь причем?
Клиент: Принтер сказал обращаться к
вам!

75
Не делайте наших ошибок

76
Звонок не нашему клиенту:
Саппорт: Мы нашли адреса
технического отдела производителей
ваших принтеров, они должны вам
помочь!
Не наш клиент: Спасибо за помощь!

77
Типичные ошибки при программировании с
использованием JNI
 Общие ошибки при программировании на С (разыменование null, доступ к

освобожденной памяти, запись по неверному адресу, и т.д.)
 Неверное использование JNI
– вызов CallObjectMethod, когда метод возвращает int и подобные ошибки
– NewGlobalRef без DeleteGlobalRef или использование объекта после DeleteGlobalRef

– Утечки LocalRef (многие JNI функции возвращают LocalRef, требуется ручное удаление в

случаях долгой жизни нативного фрейма)
– GetPrimitiveArrayCritical без ReleasePrimitiveArrayCritical
– AttachThread без DetachThread

 Полезный совет: запускайте приложение с –Xcheck:jni

78
Проблемы с JNI только в вашем коде?
Нет конечно!
 В некоторых популярных библиотеках есть баги в JNI коде
 В стандартной реализации Java от Oracle они тоже есть!

79
"Черный квадрат" Малевича:
Клиент: После компиляции Excelsior
JET при перетаскивании окна, окно не
перерисовывается. Пример
прикреплен!
Саппорт: Спасибо разберемся!

80
 Проблема в коде библиотеки awt.dll:

j2sesrcwindowsnativesunjava2dwindowsGDIBlitLoops.cpp
 При перерисовке идет доступ (на чтение) мимо выделенной

области битмапа.
 В HotSpot там всегда есть память.
 В Excelsior JET, может не быть памяти (страница отключена)
 Win API не ломается, но и ничего не рисует
81
Мистические развалы
JVM

82

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Клиент: Хьюстон! У нас проблемы!
Прием…

83

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Клиент: Хьюстон! У нас проблемы!
Прием…
Саппорт: Слышим вас хорошо, что
стряслось? Прием…

84

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Клиент: Хьюстон! У нас проблемы!
Прием…
Саппорт: Слышим вас хорошо, что
стряслось? Прием…
Клиент: У нас отключилась система
жизнеобеспечения, спасите, помогите!!!
Прием…

85

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Клиент: Хьюстон! У нас проблемы!
Прием…
Саппорт: Слышим вас хорошо, что
стряслось? Прием…
Клиент: У нас отключилась система
жизнеобеспечения, спасите, помогите!!!
Прием…
Саппорт: Что конкретно сломалось? Пусть
инженеры дадут полную техническую
картину! Прием…

86

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Клиент: Хьюстон! У нас проблемы!
Прием…
Саппорт: Слышим вас хорошо, что
стряслось? Прием…
Клиент: У нас отключилась система
жизнеобеспечения, спасите, помогите!!!
Прием…
Саппорт: Что конкретно сломалось? Пусть
инженеры дадут полную техническую
картину! Прием…
Клиент: Сломалась Виртуальная Машина
Java, после чего вся система накрылась.
Сделайте же что-нибудь! Прием…

87

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Классический вопрос: Что делать?
А покопаемся-ка мы в Hotspot логах!
# A fatal error has been detected by the Java Runtime Environment:
#
#

SIGSEGV (0xb) at pc=0xff380700, pid=583, tid=3156104

#

# JRE version: 6.0_16-b01
# Java VM: Java HotSpot(TM) Server VM (14.2-b01 mixed mode)
# Problematic frame:
# C

88

[libc_psr.so.1+0x700]

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.

memcpy+0x2f8
И как это понимать?
JVM упала при странных обстоятельствах…
 Проблема в native code?
 Может операционка барахлит?
 Что-то с памятью ее стало?

 Судя по логам, проблема может быть в libc_psr.so.1
– Processor Specific Runtime
– Specific Implementation of memcpy

89

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Копнем глубже в HotSpot Log
Похоже, что клиент что-то распаковывал…
Stack: [0xb0c00000,0xb0c80000],

sp=0xb0c7c890,

free space=498k

Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C

[libc_psr.so.1+0x700]

C

[libzip.so+0xd19c]

C

[libzip.so+0x2380]

ZIP_GetEntry+0xe4

C

[libzip.so+0x2800]

Java_java_util_zip_ZipFile_getEntry+0xc4

j

java.util.zip.ZipFile.getEntry(JLjava/lang/String;Z)J+0

j

java.util.zip.ZipFile.getEntry(JLjava/lang/String;Z)J+0

j

java.util.zip.ZipFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;+31

j

java.util.jar.JarFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;+2

j

java.util.jar.JarFile.getJarEntry(Ljava/lang/String;)Ljava/util/jar/JarEntry;+2

...

90

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.

memcpy+0x2f8
Саппорт: Вы что-то распаковывали в
вашей Java программе? Прием…

91

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Вы что-то распаковывали в
вашей Java программе? Прием…
Клиент: Ничего мы не распаковывали. Мы
вообще не работаем ни с какими архивами!
Прием…

92

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Вы что-то распаковывали в
вашей Java программе? Прием…
Клиент: Ничего мы не распаковывали. Мы
вообще не работаем ни с какими архивами!
Прием…
Саппорт: Как же так? У вас в логах
записано, что вы использовали
java.util.jar.JarFile. Прием…

93

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Вы что-то распаковывали в
вашей Java программе? Прием…
Клиент: Ничего мы не распаковывали. Мы
вообще не работаем ни с какими архивами!
Прием…
Саппорт: Как же так? У вас в логах
записано, что вы использовали
java.util.jar.JarFile. Прием…
Клиент: Да нет у нас такого в коде! Мы
вообще не работаем с jar файлами. Это
что-то не так у вас в JVM! Давайте, скорее
решайте проблему! Иначе… Прием…

94

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Мистика какая-то!
Мда… ситуация странная…
 HotSpot log stack trace показывает java.util.jar.JarFile, а

клиент это отрицает.
 Почему же тогда падает JVM?
 Может проблема в самой libzip.so?

95

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Проведем анализ!
В каких случаях Java программа может упасть работая с ZIP (или
JAR)?
 Если используемый zip файл перезаписывается
 mmap используется для отображения структуры zip файла в

память.

96

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Что мы видим?
И к чему мы приходим?
 Сценарий перезаписывания используемых файлов – это

определенно ошибка программиста!
 Одно из решений создавать резервную копию перед тем, как

открывать zip/jar file.

Но где же клиент работает с zip/jar file?
97

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Можете проверить, не
перезаписываете ли вы какие-либо файлы
во время работы программы? Прием…

98

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Можете проверить, не
перезаписываете ли вы какие-либо файлы
во время работы программы? Прием…
Клиент: У нас программа ничего такого не
делает! Прием…

99

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Можете проверить, не
перезаписываете ли вы какие-либо файлы
во время работы программы? Прием…
Клиент: У нас программа ничего такого не
делает! Прием…
Саппорт: А из ваших инженеров кто-то мог
работать с файлами, как раз в то время,
когда работала ваша Java программа?
Прием…

100

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Можете проверить, не
перезаписываете ли вы какие-либо файлы
во время работы программы? Прием…
Клиент: У нас программа ничего такого не
делает! Прием…
Саппорт: А из ваших инженеров кто-то мог
работать с файлами, как раз в то время,
когда работала ваша Java программа?
Прием…
Клиент: Вроде нет, хотя… один инженер
делал Java upgrade как раз в это время.
Подождите, мы точно проверим…

101

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Разгадка близка!
Что же на самом деле произошло?
 Инженеры перезаписывали jar файлы в JVM как раз в то время,

когда JVM еще работала.
 Именно эта ситуация и вызвала JVM crash!

102

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Ну как, проверили? Прием…

103

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Ну как, проверили? Прием…
Клиент: ДА! Мы делали Java upgrade во
время работы JVM. Прием…

104

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Ну как, проверили? Прием…
Клиент: ДА! Мы делали Java upgrade во
время работы JVM. Прием…
Саппорт: Старайтесь никогда больше так
не делать, а мы пришлем вам
рекомендации на такой случай. Как
поняли? Прием…

105

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Ну как, проверили? Прием…
Клиент: ДА! Мы делали Java upgrade во
время работы JVM. Прием…
Саппорт: Старайтесь никогда больше так
не делать, а мы пришлем вам
рекомендации на такой случай. Как
поняли? Прием…
Клиент: Поняли вас хорошо, ждем!

106

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Непонятный JVM Crash стал понятным
Рекомендации
 Не выполняйте Java upgrade, в процессе работы JVM.

 Не выполняйте обновления вашего Java приложения в то время,

когда оно еще работает.
 Даже если определенное обновление не трогает определенный
класс в вашем приложении, все равно перезапустите приложение
после того, как обновили его.
 Когда перезаписываете jar файлы, сначала удалите их, а потом
уже копируйте на это место.

107

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Как-то все сложно!
Можно попроще рекомендации?
Да проще некуда!
 Можно использовать свойство sun.zip.disableMemoryMapping

чтобы выключить mmap в zip библиотеке.
Это точно работает, начиная с Java 7.

108

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Саппорт: Рекомендации выслали! Прием…
Клиент: Спасибо, ребята, выручили! Что
бы мы без вас делали?!

Это был пример случая, где
ошибаются инженеры, а с JVM все в
порядке.

109

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Управление памятью

110
Типичные проблемы с памятью в Java
 Утечки памяти
 Неожиданные выбросы OutOfMemoryError
 Чрезмерное потребление памяти
 Долгие паузы в GC
 И многое другое

111
Письмо в техподдержку:
Клиент: Мое приложение замедляется
на 8 ядерной машине при запуске на
Excelsior JET

112
Письмо в техподдержку:
Клиент: Мое приложение замедляется
на 8 ядерной машине при запуске на
Excelsior JET

Саппорт: Есть пример?

113
Письмо в техподдержку:
Клиент: Мое приложение замедляется
на 8 ядерной машине при запуске на
Excelsior JET

Саппорт: Есть пример?
Клиент: Да – держите!

Саппорт: Спасибо разберемся!

114
Оказалось, что проблема в управлении памятью
 Выделение объектов определенного размера было недостаточно

хорошо распараллелено, так как считалось, что таких объектов в
программе должно быть мало
 Но это было не так для присланного примера!

115
Заняло несколько человеко-месяцев ..

116
Заняло несколько человеко-месяцев ..
Саппорт: Мы починили эту проблему!
Клиент: Спасибо большое!

117
Пишите в службу
поддержки!
Мы всегда рады помочь!

118
Резюмэ

 Следуйте Java спецификации (в том числе JMM)

 Пробуйте запускать ваше приложения на разных JVM, чтобы заранее

обнаруживать проблемы, в том числе связанные с многопоточностью
 На C и JNI надо писать очень аккуратно
 7 раз проверьте, что проблема не на вашей стороне, прежде чем писать в

службу поддержки
 После чего обязательно пишите – ваши случаи помогают разработчикам

улучшить JVM

119
Вопросы и
ответы
Никита Липский,
nlipsky@excelsior-usa.com, @pjBooms

Михаил Быков,
misha.bykov@oracle.com
120
Graphic Section Divider

121

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.

Mais conteúdo relacionado

Semelhante a Занимательные истории из жизни технической поддержки JVM

Полезное покрытие кода
Полезное покрытие кодаПолезное покрытие кода
Полезное покрытие кодаSQALab
 
OEM 12c релиз 3 — новые возможности и перспективы
OEM 12c релиз 3 — новые возможности и перспективыOEM 12c релиз 3 — новые возможности и перспективы
OEM 12c релиз 3 — новые возможности и перспективыAndrey Akulov
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9JavaDayUA
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Nikita Lipsky
 
Новое поколение серверов SPARC
Новое поколение серверов SPARCНовое поколение серверов SPARC
Новое поколение серверов SPARCAndrey Akulov
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!SPB SQA Group
 
Организация тестового набора при автоматизированном функциональном тестировании
Организация тестового набора при автоматизированном функциональном тестированииОрганизация тестового набора при автоматизированном функциональном тестировании
Организация тестового набора при автоматизированном функциональном тестированииSQALab
 
Client Side Autotesting Flash
Client Side Autotesting FlashClient Side Autotesting Flash
Client Side Autotesting Flashguestb0af15
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаMikhail Chinkov
 
«Oracle Application Quality Management: Средства тестирования и управления те...
«Oracle Application Quality Management: Средства тестирования и управления те...«Oracle Application Quality Management: Средства тестирования и управления те...
«Oracle Application Quality Management: Средства тестирования и управления те...Andrey Akulov
 
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиДоклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиGonchik Tsymzhitov
 
Интеллектуальная система автоматизации тестирования на базе Groovy
Интеллектуальная система автоматизации тестирования на базе GroovyИнтеллектуальная система автоматизации тестирования на базе Groovy
Интеллектуальная система автоматизации тестирования на базе GroovySQALab
 
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Oleg Chirukhin
 
Java Enterprise without Java
Java Enterprise without JavaJava Enterprise without Java
Java Enterprise without JavaOlena Syrota
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...Iosif Itkin
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 

Semelhante a Занимательные истории из жизни технической поддержки JVM (20)

Полезное покрытие кода
Полезное покрытие кодаПолезное покрытие кода
Полезное покрытие кода
 
OEM 12c релиз 3 — новые возможности и перспективы
OEM 12c релиз 3 — новые возможности и перспективыOEM 12c релиз 3 — новые возможности и перспективы
OEM 12c релиз 3 — новые возможности и перспективы
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
 
Новое поколение серверов SPARC
Новое поколение серверов SPARCНовое поколение серверов SPARC
Новое поколение серверов SPARC
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
ITGM8. Илья Коробицын (Grid Dinamics) Автоматизатор, копай глубже, копай шире!
 
Организация тестового набора при автоматизированном функциональном тестировании
Организация тестового набора при автоматизированном функциональном тестированииОрганизация тестового набора при автоматизированном функциональном тестировании
Организация тестового набора при автоматизированном функциональном тестировании
 
Client Side Autotesting Flash
Client Side Autotesting FlashClient Side Autotesting Flash
Client Side Autotesting Flash
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
MySQL 8.0
MySQL 8.0MySQL 8.0
MySQL 8.0
 
«Oracle Application Quality Management: Средства тестирования и управления те...
«Oracle Application Quality Management: Средства тестирования и управления те...«Oracle Application Quality Management: Средства тестирования и управления те...
«Oracle Application Quality Management: Средства тестирования и управления те...
 
ALG Systems
ALG SystemsALG Systems
ALG Systems
 
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиДоклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
 
Интеллектуальная система автоматизации тестирования на базе Groovy
Интеллектуальная система автоматизации тестирования на базе GroovyИнтеллектуальная система автоматизации тестирования на базе Groovy
Интеллектуальная система автоматизации тестирования на базе Groovy
 
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
 
Java Enterprise without Java
Java Enterprise without JavaJava Enterprise without Java
Java Enterprise without Java
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 

Mais de Nikita Lipsky

Escaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw LayersEscaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw LayersNikita Lipsky
 
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...Nikita Lipsky
 
Java 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall DeposeJava 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall DeposeNikita Lipsky
 
Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Nikita Lipsky
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesNikita Lipsky
 
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers Nikita Lipsky
 
Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Nikita Lipsky
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM LevelNikita Lipsky
 
Ahead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java ApplicationsAhead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java ApplicationsNikita Lipsky
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionNikita Lipsky
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Nikita Lipsky
 
JVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииJVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииNikita Lipsky
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaNikita Lipsky
 
Delivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java ApplicationsDelivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java ApplicationsNikita Lipsky
 
Java Restart with WebFX
Java Restart with WebFX Java Restart with WebFX
Java Restart with WebFX Nikita Lipsky
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действииNikita Lipsky
 
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Nikita Lipsky
 
Неумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаНеумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаNikita Lipsky
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Nikita Lipsky
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинкахNikita Lipsky
 

Mais de Nikita Lipsky (20)

Escaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw LayersEscaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw Layers
 
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
 
Java 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall DeposeJava 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall Depose
 
Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и Challenges
 
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
 
Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM Level
 
Ahead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java ApplicationsAhead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java Applications
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET
 
JVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииJVM: краткий курс общей анатомии
JVM: краткий курс общей анатомии
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на Java
 
Delivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java ApplicationsDelivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java Applications
 
Java Restart with WebFX
Java Restart with WebFX Java Restart with WebFX
Java Restart with WebFX
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действии
 
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
 
Неумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаНеумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайла
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинках
 

Último (9)

Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 

Занимательные истории из жизни технической поддержки JVM

  • 1. Занимательные истории из жизни технической поддержки JVM Никита Липский, Excelsior LLC, @pjBooms Михаил Быков, Oracle Corporation
  • 2. The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. 2 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 3. Краткое содержание  Последствия игнорирования Java спецификации  Проблемы в многопоточных программах  Ошибки программирования на С и JNI  Мистические развалы JVM  Проблемы управления памятью 3 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 4. Кто я? Где я работаю? Чем занимаюсь? Как я познакомился с Никитой и Excelsior JET? 4 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 5. Oracle Solution Support Center (SSC) DEDICATED SUPPORT TEAM ORACLE TECHNICAL ACCOUNT MANAGER • Local / Onsite & Assigned to Customer • Customer Single Point of Contact for Support Issues • Escalation Management • Proactive Support Reviews PRIORITY SERVICE REQUEST HANDLING • Faster Service Request response times • Prioritization of Service Requests in Support work queue • Escalations of Service Requests to Duty Managers based on elapsed time PREVENTIVE SERVICES 5 • 24X7 Dedicated Hotline & Immediate Response • Intimate Knowledge of Customer Business & Environments • Onsite & Remote Support Engineers • Root Cause & Corrective Action Plans • Preventive advice delivered based on specific Customer Knowledge • Advanced Diagnostic Tools providing Actionable Recommendations • Patching, Configuration & Product Use Guidance Copyright © 2013, Oracle and/or its affiliates. All rights reserved. BENEFIT Increase Availability Improve Performance & Reliability Reduce Risk Reduce Operational Cost
  • 6. SSC Delivery Model – Standard Oracle Customer Support Relationship Management Customer Management Team Customer Service Management Team Delivery Team ACS Relationship Management and Delivery Coordination Support Delivery Management Team Root Cause Analysis and Proactive Oracle Software Advice Systems Architects Performance Assessments and Other SSC Deliverables Solution Support Center (SSC) • Technical Lead • Focused Engineering Team Project Teams (Business Critical Issues on Covered Environments) (Phone Call via Dedicated Toll Free Number) • Reactive/Proactive Coverage Production Support Incident Resolution Assistance • 8x5 in Customer Time Zone Service Requests Standard SSC CSI CSI (Sev1s, Sev2s as well as any Project Specific Queries) • (US and India) Regular Business Hours Non Business Hours (Sev1s on Covered Environments) • NA SSC After Hours Staff • 24x7x365 Coverage • Specialized in Production Support GCS SR Algorithm Oracle Global Customer Support Operations (24x7x365 Operation) 6 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. • HUB • Transfer Coordinators • Product Analysts Bugs and Defects Sustaining Engineering and Product Development
  • 7. Что такое JLE? Java Licensee Engineering  Коммерческая реализация исходного кода Java  Лицензирование кода: клиенты имеют право использовать название Java в своих продуктах  Помощь клиентам в прохождении JCK тестирования  Поддержка переноса JVM на различные платформы  Excelsior JET и многое другое 7 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 9. Мы не покупали самолетов! 9
  • 10. Что такое Excelsior JET?  Полная реализация Java SE – c 2005 года cертифицирована как Java Compatible  AOT compiler + Java Runtime – смешанная компиляция: AOT + JIT – поддержка нестандартных загрузчиков классов в AOT режиме (для Eclipse RCP, Tomcat)  Toolkit – Startup Optimizer – Deployment 10
  • 12. Служба поддержки Excelsior  На связи всегда ключевые инженеры команды разработки  Пользователи, которые только пробуют продукт, обслуживаются также как купившие его  "If anyone would have a support like that, there would be much less problems." Christian Kellner of Technotrans AG 12
  • 16. 16
  • 17. Письмо в техподдержку: Клиент: Под Excelsior JET не работает приложение, при этом оно работает на HotSpot. 17
  • 18. Письмо в техподдержку: Клиент: Под Excelsior JET не работает приложение, при этом оно работает на HotSpot. Саппорт: Можете прислать приложение или пример? 18
  • 19. Письмо в техподдержку: Клиент: Под Excelsior JET не работает приложение, при этом оно работает на HotSpot. Саппорт: Можете прислать приложение или пример? Клиент: ...Хм.. Мне надо посоветоваться с начальством! 19
  • 20. Клиент: Вот приложение! Саппорт: Большое спасибо, скоро починим! 20
  • 21. И действительно не работает… Приложение бросает исключение com.thoughtworks.xstream.converters.reflection.ObjectAccessException: Invalid final field xmltest.Main.theValue У нас проблемы с Reflection? У нас проблемы с проверками доступа? 21
  • 22. Разбираемся и вот … Какой интересный код! private boolean canUseSun14ReflectionProvider(){ return (isSun() || isApple() || isHPUX() || isIBM() || isBlackdown()) && is14() && loadClass("sun.misc.Unsafe") != null; } 22
  • 23. Разбираемся и вот … Какой интересный код! private boolean canUseSun14ReflectionProvider(){ return (isSun() || isApple() || isHPUX() || isIBM() || isBlackdown()) && is14() && loadClass("sun.misc.Unsafe") != null; } В этом списке нет Excelsior 23
  • 24. Разбираемся и вот … Какой интересный код! private boolean canUseSun14ReflectionProvider(){ return (isSun() || isApple() || isHPUX() || isIBM() || isBlackdown()) && is14() && loadClass("sun.misc.Unsafe") != null; } В этом списке нет Excelsior и … Oracle. 24
  • 25. private boolean isSun(){ return System.getProperty(“java.vm.vendor”).startsWith(“Sun”); } 25
  • 26. Как мы решили проблему Системное свойство java.vm.vendor теперь выдает … Sun-Oracle Java SE licensee Excelsior LLC 26
  • 27. Как мы решили проблему Системное свойство java.vm.vendor теперь выдает … Sun-Oracle Java SE licensee Excelsior LLC Плохая (хорошая) новость: приложения использующие старую версию XStream не работают на Java 7 , потому что java.vm.vendor в HotSpot для Java 7 …. “Oracle Corporation” 27
  • 29. С выходом Java 6 Update 21 Eclipse перестал стартовать с OutOfMemoryError 29 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 30. Причина: В version info java.dll COMPANY_NAME поменяли с Sun Microsystems, на Oracle Corporation 30 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 31. Порядок полей/методов классов 31 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 32. Очередная версия JBoss перестала работать на Excelsior JET 32
  • 33. Очередная версия JBoss перестала работать на Excelsior JET … и на других JVM кроме HotSpot 33
  • 34. Причина: код JBoss ожидал, что порядок конструкторов , который возвращает Class.getDeclaredConstructors() будет определенным 34
  • 35. Но: Java спецификация для методов getDeclaredFields, getDeclaredMethods, getDeclaredContructors гласит: “ The elements in the array returned are not sorted and are not in any particular order. “ 35
  • 36. Но давайте попробуем угадать порядок Рассмотрим пример: import java.lang.reflect.*; class Test{ Test() {} Test(Object o) {} Test(String s) {} public static void main(String args[]){ for (Constructor c: Test.class.getDeclaredConstructors()) System.out.println(c); } } 36
  • 37. Его вывод: Test() Test(java.lang.Object) Test(java.lang.String) Может конструкторы возвращаются в порядке объявленном в исходном коде? 37
  • 38. Добавляем методы: void dont() {} void rely() {} void on () {} void it () {} И программа теперь выводит: Test(java.lang.String) Test(java.lang.Object) Test() 38
  • 39. Как насчет порядка полей? Популярная библиотека JNA, по умолчанию рассчитывает, что порядок полей, который возвращает метод getDeclaredFields будет тем же, что и в исходном коде. Что делать, если JVM возвращает его в другом порядке: Начиная с JNA 3.0 можно переопределить метод setFieldOrder В котором задать порядок полей 39
  • 40. Как насчет порядка методов? Однажды на тесты Eclipse стали приходить баги такого рода: JDK-7052494 - Eclipse test fails on JDK 7 b142 JDK-7022327 - java.lang.NullPointerException in org.eclipse.pde.api.tools.tests package В чем же тут дело? 40 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 41. Тесты иногда падают, и только с JDK7 Проблемы с порядком возвращения методов Рассмотрим пример: class Genius { public void getGeek() { ... } public void getNerd() { ...} } Один вызов Genius.class.getMethods() может вернуть [ getGeek, getNerd ] а другой такой же вызов вернет [ getNerd, getGeek ]. В Java SE 6 и до билда 128 в Java SE 7 методы возвращались в определенном порядке! 41 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 42. Что еще может не работать?  Может не быть <JRE>/bin/java (и других файлов внутри JRE)  Может не быть класс файлов для вашего приложения во время исполнения – Может не работать getProtectionDomain().getCodeSource()  Сообщения стандартных исключений могут отличаться на разных JVM … 42
  • 43. Что еще может не работать?  Может не быть <JRE>/bin/java (и других файлов внутри JRE)  Может не быть класс файлов для вашего приложения во время исполнения – Может не работать getProtectionDomain().getCodeSource()  Сообщения стандартных исключений могут отличаться на разных JVM  Горячая новость! В Java 9 закроют доступ к пакету sun! 43
  • 45. Типичная проблема public static boolean changed = false; Thread 1 Thread 2 while (!changed) { … sleep(1000); } … changed = true; … Что не так с этой программой? “Thread 1”останавливается? 45
  • 46. Решение public static volatile boolean changed = false; Thread 1 Thread 2 while (!changed) { … sleep(1000); } … changed = true; … И помните про JMM! 46
  • 48. Пример  SpecJVM 2008 mpegaudio package javazoom.jl.decoder; class LayerIIIDecoder { private static int reorder_table[][]; public LayerIIIDecoder() { if(reorder_table == null) { reorder_table = new int[9][]; for(int j = 0; j < 9; j++) reorder_table[j] = reorder(sfBandIndex[j].s); } } … } 48
  • 49. Пример  SpecJVM 2008 mpegaudio Далее, В методе reorder(float af[][], int i, int j) случается доступ int i4 = reorder_table[sfreq][l1]; и, как следствие, NPE (если в это время другой поток все еще продолжает инициализировать reorder_table). Stack trace: java.lang.NullPointerException at javazoom.jl.decoder.LayerIIIDecoder.reorder(Unknown Source) at javazoom.jl.decoder.LayerIIIDecoder.decode(Unknown Source) at javazoom.jl.decoder.LayerIIIDecoder.decodeFrame(Unknown Source) at javazoom.jl.decoder.Decoder.<unknown>(Unknown Source) 49
  • 50. Почему не проявляется на HotSpot? По чистой случайности!  на старте код как правило интерпретируется и многие гонки и тупики могут не проявить себя в “медленном" исполнении.  С опциями -server -Xcomp –Xbatch проявляется 50
  • 51. Проблемы только на стороне прикладных программистов? 51
  • 52. Звонок в Саппорт: Клиент: У наших инженеров виснет Java приложение. Но это происходит не всегда, только периодически. Можете помочь? 52 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 53. Звонок в Саппорт: Клиент: У наших инженеров виснет Java приложение. Но это происходит не всегда, только периодически. Можете помочь? Саппорт: Попробуем, тест кейс есть? 53 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 54. Звонок в Саппорт: Клиент: У наших инженеров виснет Java приложение. Но это происходит не всегда, только периодически. Можете помочь? Саппорт: Попробуем, тест кейс есть? Клиент: Нет, и сделать мы его не можем! 54 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 55. Виснет, но только иногда! Посмотрим, что мы имеем… The customer application was hanging at the Runtime.exec function call. They found lots of RUNNABLE threads after a JVM thread dump like: "Thread-719616" prio=3 tid=0x00b4f800 nid=0xe9aea runnable [0x94dff000] java.lang.Thread.State: RUNNABLE at java.lang.UNIXProcess.forkAndExec(Native Method) at java.lang.UNIXProcess.<init>(UNIXProcess.java:53) at java.lang.ProcessImpl.start(ProcessImpl.java:65) at java.lang.ProcessBuilder.start(ProcessBuilder.java:453) at java.lang.Runtime.exec(Runtime.java:593) at java.lang.Runtime.exec(Runtime.java:431) at java.lang.Runtime.exec(Runtime.java:328) 55 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 56. А что Гугл нам выдаeт? Много интересного? 56 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 57. Были ли похожие баги? Да были, но ничего подходящего  Мы нашли несколько багов на эту тему. Самый последний JDK- 6671051, исправлен в JDK7 build 25.  Относящиеся к похожей проблеме баги в Solaris были давно исправлены.  Инженеры иногда сталкивались с подобным случаем, но ни у кого не было примера, воспроизводящего проблему. Похоже, это что-то новое! 57 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 58. Что мы имеем в логах? Очень много потоков в одном и том же состоянии Many RUNNABLE threads stuck at java.lang.UNIXProcess.forkAndExec(Native Method) and the corresponding lwp in state like ----------------- lwp# 957183 / thread# 957183 -------------------- ff24aa68 lwp_park (0, 0, 0) ff23c6a4 fork (1, 0, 0, 0, ff2c79a0, 992a9200) + b8 fe25a3a8 startChild (44e9e8, fdf, fdf, fe278000, 1dc6c, fdc) + 18 fe25a6b8 Java_java_lang_UNIXProcess_forkAndExec (44bd28, fd8, 44e9e8, 940ff65c, fd9, 0) + 2b4 ----------------58 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 59. Когда вызывается Runtime.exec? Во многих местах… и запускает различные команды  cksum  sudo  /usr/bin/pgrep –x “process name”  String[] command = {"sh", "-c", "grep ce1 " + hosts + " |grep –v somehost | tr -s 't' ' ' | tr -s ' ' ' ' | egrep -v "^#" | cut -d' ' -f1 | head -1"}; ExternalCommandExecutor executor = new ExternalCommandExecutor(command); 59 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 60. Картина маслом! Проблема ли это в JVM? Имеем у клиента:  Гигабайтный java процесс  >5700 потоков, и они периодически запускают внешние процессы с помощью java/util/TimerThread.run()  UNIXProcess.forkAndExec() с системным вызовом fork(), который не возвращает ничего. А почему так происходит? 60 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 61. Что там в core файле? Напускаем gcore на повисший процесс и смотрим в core file через dbx… (dbx) thread t@213 t@213 (l@213) stopped in __lwp_park at 0xff27ac78 0xff27ac78: __lwp_park+0x0010: ta %icc,0x00000008 (dbx) thread -blockedby Thread t@213 is blocked by: 0x01046c30 (0x1046c30): thread mutex(locked) Lock owned by t@213 61 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 62. Что скажет stack trace? (dbx) where current thread: t@213 =>[1] __lwp_park(0x0, 0x0, 0x0, 0x0, 0xff3f6950, 0x1), at 0xff27ac78 [2] mutex_lock_queue(0xc9a5a200, 0x0, 0x1046c30, 0x0, 0x1c00, 0x1d3c), at 0xff272fd8 [3] soft_acquire_all_session_mutexes(0x0, 0x0, 0x1046b00, 0x0, 0xcc3c70b8, 0x1cc7488), at 0xcc36c8f4 [4] softtoken_fork_prepare(0xcc3c7090, 0x1, 0x0, 0xcc3c4000, 0x5d8b0, 0xcc3c4a34), at 0xcc3667ac [5] _prefork_handler(0x1d18, 0xff2f7940, 0x1c00, 0x0, 0xff2f79a0, 0x0), at 0xff1f3640 [6] _fork1(0x1, 0xffffffff, 0x0, 0x0, 0xff2f79a0, 0xc9a5a200), at 0xff26c8cc [7] Java_java_lang_UNIXProcess_forkAndExec(0x1b33128, 0x0, 0xc7d5f588, 0xc7d5f584, 0xffffffff, 0x0), at 0xfdf797c0 ... 62 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 63. Анализируем Java Process Смотрим адрес в pmap или в dbx soft_acquire_all_session_mutexes (0xcc36c8f4) принадлежит к pkcs11_softtoken_extra.so.1: CC360000 320K r-x-- /usr/lib/security/pkcs11_softtoken_extra.so.1 CC3B0000 16K r-x-- /usr/lib/security/pkcs11_softtoken_extra.so.1 А это библиотека из Solaris, и в ней deadlock! 63 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 64. Проблема не в JVM! Какие рекомендации дать клиенту? Использовать другую security provider library, но только не pkcs11, или добавить следующий параметр в java строчку при запуске: -Dsun.security.pkcs11.enable-solaris=false Breaking News: Команда Solaris security сообщила, что этот баг в pkcs11 должен быть уже исправлен начиная с Solaris 10 Update 11. 64 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 65. Звонок клиенту: Саппорт: Рекомендации выслали! 65 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 66. Звонок клиенту: Саппорт: Рекомендации выслали! Клиент: Спасибо, мы вставили опцию в Java строку и все работает! 66 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 67. Звонок клиенту: Саппорт: Рекомендации выслали! Клиент: Спасибо, мы вставили опцию в Java строку и все работает! Это был пример случая, где проблема в OS библиотеке, а не в JVM. 67 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 68. Другие проблемы в OS, hardware  Win API вызов GetThreadContext на WOW64 может возвращать устаревший (не актуальный) контекст https://connect.microsoft.com/VisualStudio/feedback/details/621594/getthreadcontext-may-return-stale-contents-from-previous-call-out-to-long-mode  Этот вызов используется GC при сканировании стэка  В результате, могут удаляться живые объекты доступные со стэка  А бывают еще проблемы в “железе” … 68
  • 69. JNI – как лучший способ разломать JVM 69
  • 70. Как разломать JVM? Очень просто public class JVMCrash { public static native void main(String[] args); static { System.loadLibrary("JVMCrash"); } } JNIEXPORT void JNICALL Java_JVMCrash_main(JNIEnv * env, jclass class, jobjectArray args) { printf("%sn“, ((char *)args)[0]); } 70
  • 71. Кто найдет больше ошибок? JNIEXPORT void JNICALL Java_JVMCrash_main(JNIEnv * env, jclass class, jobjectArray args) { printf("%sn“,((char *)args)[0]); } 71
  • 72. Запускаем и получаем … # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7727d193, pid=2852, tid=3572 # # JRE version: 6.0_29-b11 # Java VM: Java HotSpot(TM) Client VM (20.4-b02 mixed mode, sharing windows-x86 ) # Problematic frame: # C [msvcrt.dll+0xd193] # # An error report file with more information is saved as: # C:workkitsupporttaleshs_err_pid2852.log # # If you would like to submit a bug report, please visit: # http://java.sun.com/webapps/bugreport/crash.jsp # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. 72
  • 73. Письмо в техподдержку: Клиент: Помогите, у нас сломался принтер, тираж горит!!! 73
  • 74. Письмо в техподдержку: Клиент: Помогите, у нас сломался принтер, тираж горит!!! Саппорт: А мы здесь причем? 74
  • 75. Письмо в техподдержку: Клиент: Помогите, у нас сломался принтер, тираж горит!!! Саппорт: А мы здесь причем? Клиент: Принтер сказал обращаться к вам! 75
  • 77. Звонок не нашему клиенту: Саппорт: Мы нашли адреса технического отдела производителей ваших принтеров, они должны вам помочь! Не наш клиент: Спасибо за помощь! 77
  • 78. Типичные ошибки при программировании с использованием JNI  Общие ошибки при программировании на С (разыменование null, доступ к освобожденной памяти, запись по неверному адресу, и т.д.)  Неверное использование JNI – вызов CallObjectMethod, когда метод возвращает int и подобные ошибки – NewGlobalRef без DeleteGlobalRef или использование объекта после DeleteGlobalRef – Утечки LocalRef (многие JNI функции возвращают LocalRef, требуется ручное удаление в случаях долгой жизни нативного фрейма) – GetPrimitiveArrayCritical без ReleasePrimitiveArrayCritical – AttachThread без DetachThread  Полезный совет: запускайте приложение с –Xcheck:jni 78
  • 79. Проблемы с JNI только в вашем коде? Нет конечно!  В некоторых популярных библиотеках есть баги в JNI коде  В стандартной реализации Java от Oracle они тоже есть! 79
  • 80. "Черный квадрат" Малевича: Клиент: После компиляции Excelsior JET при перетаскивании окна, окно не перерисовывается. Пример прикреплен! Саппорт: Спасибо разберемся! 80
  • 81.  Проблема в коде библиотеки awt.dll: j2sesrcwindowsnativesunjava2dwindowsGDIBlitLoops.cpp  При перерисовке идет доступ (на чтение) мимо выделенной области битмапа.  В HotSpot там всегда есть память.  В Excelsior JET, может не быть памяти (страница отключена)  Win API не ломается, но и ничего не рисует 81
  • 82. Мистические развалы JVM 82 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 83. Клиент: Хьюстон! У нас проблемы! Прием… 83 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 84. Клиент: Хьюстон! У нас проблемы! Прием… Саппорт: Слышим вас хорошо, что стряслось? Прием… 84 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 85. Клиент: Хьюстон! У нас проблемы! Прием… Саппорт: Слышим вас хорошо, что стряслось? Прием… Клиент: У нас отключилась система жизнеобеспечения, спасите, помогите!!! Прием… 85 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 86. Клиент: Хьюстон! У нас проблемы! Прием… Саппорт: Слышим вас хорошо, что стряслось? Прием… Клиент: У нас отключилась система жизнеобеспечения, спасите, помогите!!! Прием… Саппорт: Что конкретно сломалось? Пусть инженеры дадут полную техническую картину! Прием… 86 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 87. Клиент: Хьюстон! У нас проблемы! Прием… Саппорт: Слышим вас хорошо, что стряслось? Прием… Клиент: У нас отключилась система жизнеобеспечения, спасите, помогите!!! Прием… Саппорт: Что конкретно сломалось? Пусть инженеры дадут полную техническую картину! Прием… Клиент: Сломалась Виртуальная Машина Java, после чего вся система накрылась. Сделайте же что-нибудь! Прием… 87 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 88. Классический вопрос: Что делать? А покопаемся-ка мы в Hotspot логах! # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0xff380700, pid=583, tid=3156104 # # JRE version: 6.0_16-b01 # Java VM: Java HotSpot(TM) Server VM (14.2-b01 mixed mode) # Problematic frame: # C 88 [libc_psr.so.1+0x700] Copyright © 2013, Oracle and/or its affiliates. All rights reserved. memcpy+0x2f8
  • 89. И как это понимать? JVM упала при странных обстоятельствах…  Проблема в native code?  Может операционка барахлит?  Что-то с памятью ее стало?  Судя по логам, проблема может быть в libc_psr.so.1 – Processor Specific Runtime – Specific Implementation of memcpy 89 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 90. Копнем глубже в HotSpot Log Похоже, что клиент что-то распаковывал… Stack: [0xb0c00000,0xb0c80000], sp=0xb0c7c890, free space=498k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) C [libc_psr.so.1+0x700] C [libzip.so+0xd19c] C [libzip.so+0x2380] ZIP_GetEntry+0xe4 C [libzip.so+0x2800] Java_java_util_zip_ZipFile_getEntry+0xc4 j java.util.zip.ZipFile.getEntry(JLjava/lang/String;Z)J+0 j java.util.zip.ZipFile.getEntry(JLjava/lang/String;Z)J+0 j java.util.zip.ZipFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;+31 j java.util.jar.JarFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;+2 j java.util.jar.JarFile.getJarEntry(Ljava/lang/String;)Ljava/util/jar/JarEntry;+2 ... 90 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. memcpy+0x2f8
  • 91. Саппорт: Вы что-то распаковывали в вашей Java программе? Прием… 91 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 92. Саппорт: Вы что-то распаковывали в вашей Java программе? Прием… Клиент: Ничего мы не распаковывали. Мы вообще не работаем ни с какими архивами! Прием… 92 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 93. Саппорт: Вы что-то распаковывали в вашей Java программе? Прием… Клиент: Ничего мы не распаковывали. Мы вообще не работаем ни с какими архивами! Прием… Саппорт: Как же так? У вас в логах записано, что вы использовали java.util.jar.JarFile. Прием… 93 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 94. Саппорт: Вы что-то распаковывали в вашей Java программе? Прием… Клиент: Ничего мы не распаковывали. Мы вообще не работаем ни с какими архивами! Прием… Саппорт: Как же так? У вас в логах записано, что вы использовали java.util.jar.JarFile. Прием… Клиент: Да нет у нас такого в коде! Мы вообще не работаем с jar файлами. Это что-то не так у вас в JVM! Давайте, скорее решайте проблему! Иначе… Прием… 94 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 95. Мистика какая-то! Мда… ситуация странная…  HotSpot log stack trace показывает java.util.jar.JarFile, а клиент это отрицает.  Почему же тогда падает JVM?  Может проблема в самой libzip.so? 95 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 96. Проведем анализ! В каких случаях Java программа может упасть работая с ZIP (или JAR)?  Если используемый zip файл перезаписывается  mmap используется для отображения структуры zip файла в память. 96 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 97. Что мы видим? И к чему мы приходим?  Сценарий перезаписывания используемых файлов – это определенно ошибка программиста!  Одно из решений создавать резервную копию перед тем, как открывать zip/jar file. Но где же клиент работает с zip/jar file? 97 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 98. Саппорт: Можете проверить, не перезаписываете ли вы какие-либо файлы во время работы программы? Прием… 98 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 99. Саппорт: Можете проверить, не перезаписываете ли вы какие-либо файлы во время работы программы? Прием… Клиент: У нас программа ничего такого не делает! Прием… 99 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 100. Саппорт: Можете проверить, не перезаписываете ли вы какие-либо файлы во время работы программы? Прием… Клиент: У нас программа ничего такого не делает! Прием… Саппорт: А из ваших инженеров кто-то мог работать с файлами, как раз в то время, когда работала ваша Java программа? Прием… 100 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 101. Саппорт: Можете проверить, не перезаписываете ли вы какие-либо файлы во время работы программы? Прием… Клиент: У нас программа ничего такого не делает! Прием… Саппорт: А из ваших инженеров кто-то мог работать с файлами, как раз в то время, когда работала ваша Java программа? Прием… Клиент: Вроде нет, хотя… один инженер делал Java upgrade как раз в это время. Подождите, мы точно проверим… 101 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 102. Разгадка близка! Что же на самом деле произошло?  Инженеры перезаписывали jar файлы в JVM как раз в то время, когда JVM еще работала.  Именно эта ситуация и вызвала JVM crash! 102 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 103. Саппорт: Ну как, проверили? Прием… 103 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 104. Саппорт: Ну как, проверили? Прием… Клиент: ДА! Мы делали Java upgrade во время работы JVM. Прием… 104 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 105. Саппорт: Ну как, проверили? Прием… Клиент: ДА! Мы делали Java upgrade во время работы JVM. Прием… Саппорт: Старайтесь никогда больше так не делать, а мы пришлем вам рекомендации на такой случай. Как поняли? Прием… 105 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 106. Саппорт: Ну как, проверили? Прием… Клиент: ДА! Мы делали Java upgrade во время работы JVM. Прием… Саппорт: Старайтесь никогда больше так не делать, а мы пришлем вам рекомендации на такой случай. Как поняли? Прием… Клиент: Поняли вас хорошо, ждем! 106 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 107. Непонятный JVM Crash стал понятным Рекомендации  Не выполняйте Java upgrade, в процессе работы JVM.  Не выполняйте обновления вашего Java приложения в то время, когда оно еще работает.  Даже если определенное обновление не трогает определенный класс в вашем приложении, все равно перезапустите приложение после того, как обновили его.  Когда перезаписываете jar файлы, сначала удалите их, а потом уже копируйте на это место. 107 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 108. Как-то все сложно! Можно попроще рекомендации? Да проще некуда!  Можно использовать свойство sun.zip.disableMemoryMapping чтобы выключить mmap в zip библиотеке. Это точно работает, начиная с Java 7. 108 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 109. Саппорт: Рекомендации выслали! Прием… Клиент: Спасибо, ребята, выручили! Что бы мы без вас делали?! Это был пример случая, где ошибаются инженеры, а с JVM все в порядке. 109 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 111. Типичные проблемы с памятью в Java  Утечки памяти  Неожиданные выбросы OutOfMemoryError  Чрезмерное потребление памяти  Долгие паузы в GC  И многое другое 111
  • 112. Письмо в техподдержку: Клиент: Мое приложение замедляется на 8 ядерной машине при запуске на Excelsior JET 112
  • 113. Письмо в техподдержку: Клиент: Мое приложение замедляется на 8 ядерной машине при запуске на Excelsior JET Саппорт: Есть пример? 113
  • 114. Письмо в техподдержку: Клиент: Мое приложение замедляется на 8 ядерной машине при запуске на Excelsior JET Саппорт: Есть пример? Клиент: Да – держите! Саппорт: Спасибо разберемся! 114
  • 115. Оказалось, что проблема в управлении памятью  Выделение объектов определенного размера было недостаточно хорошо распараллелено, так как считалось, что таких объектов в программе должно быть мало  Но это было не так для присланного примера! 115
  • 117. Заняло несколько человеко-месяцев .. Саппорт: Мы починили эту проблему! Клиент: Спасибо большое! 117
  • 118. Пишите в службу поддержки! Мы всегда рады помочь! 118
  • 119. Резюмэ  Следуйте Java спецификации (в том числе JMM)  Пробуйте запускать ваше приложения на разных JVM, чтобы заранее обнаруживать проблемы, в том числе связанные с многопоточностью  На C и JNI надо писать очень аккуратно  7 раз проверьте, что проблема не на вашей стороне, прежде чем писать в службу поддержки  После чего обязательно пишите – ваши случаи помогают разработчикам улучшить JVM 119
  • 120. Вопросы и ответы Никита Липский, nlipsky@excelsior-usa.com, @pjBooms Михаил Быков, misha.bykov@oracle.com 120
  • 121. Graphic Section Divider 121 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.