На малиновом пи ноль я вызываю java-подпрограмму playsound (String pSoundDateiName), и она работает первые два раза.в третий раз я называю это (из основной программы) сбой jvm.Я обнаружил, что вызов play.open является проблемой, эта команда приведет к падению.Кто-нибудь знает, почему?Или другое решение?
public static void playsound(String pSoundDateiName){
try {
File in = new File(pSoundDateiName);
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
Clip play = AudioSystem.getClip();
play.open(audioInputStream);
play.start();
Thread.sleep(2000);
play.drain();
play.close();
audioInputStream.close();
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException | InterruptedException ex) {
ex.printStackTrace();
};
};
Actual result after the third call:
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0xb651e5fc, pid=12133, tid=2911761520
#
# JRE version: Java(TM) SE Runtime Environment (8.0_65-b17) (build 1.8.0_65-b17)
# Java VM: Java HotSpot(TM) Client VM (25.65-b01 mixed mode linux-arm )
# Problematic frame:
# V [libjvm.so+0x1c05fc]
Я попробовал более новую версию Java, но с тем же результатом: (но теперь у нас есть "DefNewGeneration :: copy_to_survivor_space (oopDesc *)")
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0xb64d2b98, pid=1001, tid=0xb3ed7470
#
# JRE version: Java(TM) SE Runtime Environment (8.0_191-b12) (build 1.8.0_191-b12)
# Java VM: Java HotSpot(TM) Client VM (25.191-b12 mixed mode linux-arm )
# Problematic frame:
# V [libjvm.so+0x1c4b98] DefNewGeneration::copy_to_survivor_space(oopDesc*)+0xc
Я нашел файл "hs_err_pid1001.log" и попытался понять его содержание, но его очень трудно прочитать
Что я могу сделать с такой проблемой?Если в jvm есть ошибка, что я могу сделать?
Я сделал полную новую минималистичную установку raspberry stretch (lite), использовал новейшую версию java (192), и проблема та же.Но я понял, что могу делать больше вызовов подпрограммы, пока она не вылетит.Кроме того, когда я изменил использование памяти (разделение памяти) системы, тогда количество вызовов подпрограммы (до сбоя) изменяется.Я думаю, что в моей программе нет "очистки" от использования памяти.Могу ли я заставить Java сделать такую "чистку"?Есть еще идеи?
Теперь у меня есть обходной путь для моей проблемы.Я запускаю основную программу с помощью вызова java "java -Xms128M -Xmx256M ...", который дает мне больше доступной памяти и более ста вызовов подпрограммы до сбоя.Кроме того, моя малина будет загружаться автоматически каждую ночь.Я знаю, что это не идеальное решение, но оно работает.Спасибо всем вам.