我们有一个播放视频文件的JavaFX程序。我们遇到的问题是,当视频文件加载到内存中并播放时,播放下一个视频文件时不会卸载它。问题在于,在播放了一定数量的视频后,内存已满,机器从完全记忆中尖叫停止。
我们已经尝试构建该程序的64位版本,但没有任何优势。
答案 0 :(得分:1)
Java默认使用标记扫描类型的垃圾收集器,而不是引用计数垃圾收集器。这意味着当您删除对旧视频的所有引用时,视频不会从内存中卸载,而是Java运行库会等到程序在调用垃圾收集器之前使用了一定量的内存。这些参数在Java命令行上设置,或者在每个平台的基础上默认。听起来您的Java垃圾收集参数设置得太高,因此Java在消耗机器中的所有内存之前不会进行垃圾收集。
要设置最大内存量,请在运行程序之前将以下内容添加到JAVA_OPTS环境变量中:
-verbose:gc -Xmx1200m
第一个将告诉你垃圾收集器发生了什么,第二个设置了Java将使用的最大内存量,在这种情况下为1.2千兆字节。设置为机器总内存的一小部分,但足够大,以便您可以将视频加载到内存中。
您可能还想添加
-XX:+UseG1GC
以保持垃圾收集延迟较低。这会牺牲一些最终性能,以防止垃圾收集不时延迟10秒。今天的机器速度如此之快,记忆力如此之大,以至于对于交互式程序,您会发现垃圾收集延迟远远超过您注意到G1GC施加的任何减速。
您还希望确保在加载新视频后立即删除对旧视频的所有引用。否则,如果它具有可访问的引用,则它不会被垃圾收集器卸载。