我的应用程序在启动时加载一堆音频剪辑。它使用java.applet.Applet.newAudioClip(URL audioFileURL)加载文件,这些文件位于同一个文件夹中。我可以看到,这个函数基本上是获取JavaSoundAudioClip对象的包装器。
直到昨天,我使用JDK 7编译了JAR,并使用JRE版本7更新45启动了JAR。然后我更新到版本8更新31。
现在,每个音频的加载时间比以前长10倍(每次0.2秒,现在是2到3秒)。
相同的行为发生在不同的硬件配置上。操作系统是64位Windows 7,Java 7和8运行时环境都是32位。
在调试过程中,我发现最慢的方法是AudioSystem.getAudioInputStream、AudioSystem.isLineSupported、AudioSystem.getLine。
不应该涉及音频格式:我尝试了OGG和WAV的结果相同。
两个JVM的设置是相同的。
编辑:即使是我也无法在一个临时制作的小程序中重现这个问题。Java 8确实比较慢,但只有10%的系数。我的应用程序和我所使用的库肯定有一些与音频系统和/或其流相冲突的东西。一旦我发现,我会尽快更新。
发布于 2015-02-24 13:40:51
最后,我发现是什么导致了这个问题。我使用了JAR- inside加载器(据我所知,它相当于Eclipse选项“将所需的库打包到生成的JAR")来在我的应用程序中包含库JAR。到目前为止,这从未对性能产生任何明显的影响。
但是在Java 8中,我经历了这种巨大的减速。使用j控制台监视应用程序时,我注意到它经常被阻塞,等待压缩压缩操作,所以在jars 8中一定发生了一些变化,现在jars 8没有对jars中的jars进行优化。
我决定提取所有库jar,然后将它们打包到我的应用程序jar中。
发布于 2015-02-21 00:06:28
Java 8介绍了一些垃圾收集器的新技术。由于您正在将数据/对象加载到VM中,它们可能会被触发以执行并发清理和并行压缩。建议您调优JVM GC参数。
并发垃圾收集器将使用的-XX:ConcGCThreads=n线程数。缺省值随运行JVM的平台而变化。
启动并发GC周期的(整个)堆占用率的-XX:InitiatingHeapOccupancyPercent=n百分比。它被GC使用,它根据整个堆的占用率触发并发GC循环,而不仅仅是一个代(例如G1)。值0表示“do常量GC循环”。默认值为45。
-XX:ParallelGCThreads=n设置垃圾收集器并行阶段使用的线程数。缺省值随运行JVM的平台而变化。并发垃圾收集器将使用的-XX:ConcGCThreads=n线程数。缺省值随运行JVM的平台而变化。
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
好心地,让我知道如果GC调优有帮助,我不能复制您的场景,但这将是一个有趣的事实,了解是什么导致它!
https://stackoverflow.com/questions/28504943
复制相似问题