繁体   English   中英

Java垃圾收集器的出现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM