在树莓派零上,我调用一个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中有错误,我该怎么办?
我现在做了一个全新的简约的树莓拉伸(精简版)安装,使用了最新版本的Java(192),问题是相同的。 但是我认识到我可以对子程序进行更多的调用,直到它崩溃为止。另外,当我更改系统的内存使用率(内存拆分)时,子程序调用的数量(直到崩溃)也会更改。 我认为程序中没有“清理”内存使用情况。 我可以强迫Java进行这种“清理”吗? 还有其他想法吗?
我现在有解决此问题的方法。我使用java调用“ java -Xms128M -Xmx256M ...”启动主程序,这给了我更多可用内存,并且超过100个子程序调用直到崩溃。另外,我的树莓每晚都会自动启动。 我知道这不是完美的解决方案,但可以解决。 谢谢大家。
答案 0 :(得分:0)
与audioInputStream.close()
一起使用后,请尝试关闭audioInputStream对象。