Java-从内存中卸载媒体
我们有一个播放视频文件的JavaFX程序。我们遇到的问题是,当视频文件加载到内存并播放时,在下一个视频文件播放时它不会被卸载。问题是,在播放了一定数量的视频后,内存已满,机器会尖叫着从满内存停止Java-从内存中卸载媒体,java,video,memory,memory-management,Java,Video,Memory,Memory Management,我们有一个播放视频文件的JavaFX程序。我们遇到的问题是,当视频文件加载到内存并播放时,在下一个视频文件播放时它不会被卸载。问题是,在播放了一定数量的视频后,内存已满,机器会尖叫着从满内存停止 我们已经尝试构建该程序的64位版本,但没有任何优势。Java默认使用标记扫描类型的垃圾收集器,而不是引用计数垃圾收集器。这意味着,当您删除对旧视频的所有引用时,视频不会从内存中卸载,而是Java运行时在调用垃圾收集器之前等待程序使用了一定量的内存。这些参数在Java命令行上设置,或者在每个平台上默认设置
我们已经尝试构建该程序的64位版本,但没有任何优势。Java默认使用标记扫描类型的垃圾收集器,而不是引用计数垃圾收集器。这意味着,当您删除对旧视频的所有引用时,视频不会从内存中卸载,而是Java运行时在调用垃圾收集器之前等待程序使用了一定量的内存。这些参数在Java命令行上设置,或者在每个平台上默认设置。听起来您的Java垃圾收集参数设置得太高,因此Java在消耗机器中的所有内存之前不会进行垃圾收集 要设置最大内存量,请在运行程序之前将以下内容添加到JAVA_OPTS环境变量中:
-verbose:gc -Xmx1200m
第一个将告诉您垃圾收集器发生了什么,第二个将设置Java将使用的最大内存量,在本例中为1.2GB。设置为计算机总内存的一小部分,但足够大,以便您可以将视频加载到内存中
你不妨补充一点
-XX:+UseG1GC
为了降低垃圾收集延迟。这牺牲了一些最终性能,以防止垃圾收集有时延迟10秒。今天的机器速度如此之快,内存如此之大,以至于对于交互式程序,您会注意到垃圾收集延迟,远远超过G1GC造成的任何减速
您还需要确保在加载新视频后立即删除对旧视频的所有引用。否则,如果它有一个可访问的引用,垃圾收集器将不会卸载它。如果您不向我们显示代码,我们无法帮助您找到错误。