[英]Java Occurances of Garbage Collector
我正在用Java开发游戏。 我正在快速测试音频播放,以确保它能正常工作。 下面的代码是主要方法。
final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JFXPanel();
latch.countDown();
}
});
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
//assets grabs a Media object
new MediaPlayer(Assets.getMedia("aBstracT - Vivacious Vagabonds.mp3")).play();
//cannot create an anonymous inner class of media player
new Object() {
@Override
public void finalize() {
System.out.println("Garbage collected");
}
};
我很困惑,发现音乐持续40秒停了下来。 我的猜测是垃圾收集(我意识到我没有引用任何媒体对象),我从打印输出中确认了这一点。
我的问题如下:
为什么是40秒? 什么时候进行垃圾收集? 我觉得很奇怪,并且一直认为JVM仅在有太多未使用的对象(或某些东西,我真的不知道)时才尝试进行垃圾回收。
其次,有什么方法可以标记JVM来垃圾收集对象? 对于JVM,在决定是否应将其从内存中删除之前,寻找对每个对象的引用似乎效率不高。 我还担心在垃圾回收出错的情况下发生内存泄漏。
提前致谢。
要回答您的问题:无法保证GC会随时加入。 如果您不使用对象,则可以实施GC来实现。 它完全取决于实现,并且Sun和Oracle已实现了许多不同的GC实现。 对于您的情况,对于您的JVM版本,它将在40秒后启动。 添加更多的内存可能会更改该计时器。 在Android上运行可能会更改它,升级到JDK 9可能会更改它。
您的第二个问题也相同:通过删除对GC的所有对象来标记该对象。 将局部变量设置为null的所有常见设置完全没有用。 退出该方法时,该变量以及对该对象的引用将被删除。 GC不会出错。 如果确实如此,那将是JVM中的一个错误,并且是一个超出您想象的更大的问题:-)
如果您担心GC性能,那么您并不孤单。 但老实说,这不再是一个大问题。 您需要确定需要分配的内存,以免GC冻结应用程序。 要全面了解GC机制,请在此处查看: http : //www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
要解决您的问题,您需要在媒体播放器上保留一个参考。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.