为什么我的jvm在调用clip.open后崩溃



在树莓pi zero上,我调用一个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中有错误,我该怎么办?

我现在做了一个全新的树莓拉伸(lite)的极简主义安装,使用了最新版本的java(192),问题是一样的。但我意识到我可以对子程序进行更多的调用,直到它崩溃。此外,当我更改系统的内存使用情况(内存拆分)时,子程序调用次数(直到崩溃)也会发生变化。我认为在我的程序中并没有"清理"内存使用情况。我能强迫java做这样的"清理"吗?还有其他想法吗?

我现在有了解决问题的办法。我用java调用"java-Xms128M-Xmx256M…"启动主程序,这给了我更多的可用内存和一百多次子程序调用,直到崩溃。此外,我的树莓每天晚上都会自动启动。我知道这不是一个完美的解决方案,但它是有效的。感谢大家。

将audioInputStream对象与audioInputStream.close()一起使用后,请尝试关闭该对象。

最新更新