java - JVM 为 40 行代码消耗了我所有的 RAM

标签 java javafx

我在 KDE 上使用 64 位 linux 机器(8GB RAM),并将 Eclipse 作为我的 IDE。我也在使用 Oracle 的 JDK。我使用 JavaFX 制作了一个小动画,并使用网络上的一些图片制作了围绕太阳旋转的地球动画。每当我运行它时,动画都会正常运行,但它会稳定地占用我计算机上的所有 RAM,直到一切都卡住。这通常需要不到 5 分钟的时间。

package Practice;
/**
 * For some reason, this code gobbles up memory, and freezes computers
 */

import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class BasicAnimation extends Application {

    public BasicAnimation() {
        // TODO Auto-generated constructor stub
    }

    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Orbit");

        Group root = new Group();
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);

        Canvas canvas = new Canvas(512,512);
        root.getChildren().add(canvas);

        GraphicsContext gc = canvas.getGraphicsContext2D();

            Image earth = new Image(getClass().getResourceAsStream("earth.png"), 25.0, 25.0 ,false, false);
        Image sun = new Image(getClass().getResourceAsStream("sun.jpg"), 50.0, 50.0, false, false);
        Image space = new Image(getClass().getResourceAsStream("space.jpg"));

        final long startNanoTime = System.nanoTime();

        new AnimationTimer() {

            public void handle(long currentNanoTime) {

                double t = (currentNanoTime - startNanoTime) / 1000000000.0 ;

                double x = 232 + 128 * Math.cos(t);
                double y = 232 + 128 * Math.sin(t);

                //background image clears canvas

                gc.drawImage(space, 0, 0);
                gc.drawImage(earth, x, y);
                gc.drawImage(sun, 196, 196);

            }
        }.start();

        primaryStage.show();
    }
}

我设置了 -Xms512m、-Xmx512m 和 -Xss512m。有没有我做错的事情可能导致这种情况,你能解释为什么会发生这种情况或如何避免这种情况吗?

另外,如果我的问题有问题,请告诉我。

编辑:添加了更多信息

地球图片是2356x2356,我在程序中设置为25x25px。太阳图是750x750,我在程序中设置为50x50。空间图像为1920x1080,背景为512x512 px。

图片链接

孙:https://www.thesun.co.uk/wp-content/uploads/2016/06/download.jpg?w=750&strip=all

地球:https://openclipart.org/image/2400px/svg_to_png/218125/3d-Earth-Globe.png

空间:http://www.gunnars.com/wp-content/uploads/2014/08/Space.jpg

最佳答案

我看不出您的代码有任何问题。这可能不是在 JavaFX 中执行此操作的最佳方法,但它对我来说看起来非常有效并且不应该占用任何内存。特别是当你说你对 Luke 的其他代码有同样的问题时,我怀疑是一些 Linux 错误。您是否尝试过在另一个操作系统上运行您的程序?如果您提供图片链接,其他人也可以尝试这样做。

此链接可能与您的问题有关: javafx-unexplainable-leaks-memory-on-linux

测试

我在 Mac 上运行了你的程序,没有内存泄漏,几乎没有 CPU 使用,正如我所预料的那样。

关于java - JVM 为 40 行代码消耗了我所有的 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900718/

相关文章:

java - 从服务通过 JACOB 调用时,Office 2007 无法打开文件

java - Java5/Java6 应用程序到 Java 7 的周到迁移计划?

显示警报消息时 Javafx 全屏应用程序会最小化

java - DoublePropertyBase 中的 get() 和 GetValue() 有什么区别?

java - 为什么我不能启动这个简单的 FXML hello world 应用程序?

在Android中运行TensorFlow模型时出现java.nio.BufferOverflowException运行时错误?

security - Java认证、授权服务(JAAS)

java - 如何为特定包maven创建jar

java - 有没有办法让 Datepicker 循环? (JavaFX)

JavaFX:点击某物时播放声音