Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行速度慢,内存使用率高_Java_Performance_Memory - Fatal编程技术网

Java 运行速度慢,内存使用率高

Java 运行速度慢,内存使用率高,java,performance,memory,Java,Performance,Memory,我正在为我的班级写一个基于文本的小游戏。导航很简单,玩家点击按钮进入不同的部分。所有这些部分都被分成各自的代码块。到目前为止,我只设置了两个部件,每个部件都可以通过按钮相互接触。基本上: private void level1() { //Stuff here, player clicks a button which runs "level2();" } private void level2() { //Stuff here, player clicks a button which ru

我正在为我的班级写一个基于文本的小游戏。导航很简单,玩家点击按钮进入不同的部分。所有这些部分都被分成各自的代码块。到目前为止,我只设置了两个部件,每个部件都可以通过按钮相互接触。基本上:

private void level1() {
//Stuff here, player clicks a button which runs "level2();"
}

private void level2() {
//Stuff here, player clicks a button which runs "level1();"
}
这样做很好,但是在1和2之间来回点击之后,程序开始运行得非常慢。任务管理器报告了大约700MB的内存使用量

我肯定我错过了一些很明显的东西。我正在寻找一种方法,让用户能够多次点击多个按钮,而不会让程序占用太多资源。非常感谢您的帮助

编辑:更多的代码。选项1-3是按钮的名称。变量已经在程序顶部声明,并在初始化部分设置。它们将使用每个代码块进行修改,如Scene1和scene2

private void setScene1() // TITLE SCREEN
{
    TITLE.setText("Title Label");
    main.setText("Main text body for the game.");
    choice1.setText("Play");
    choice1.setBounds(10, 600, 996, 91); // This makes choice1 as large as
                                            // all three buttons combined.
    choice2.setEnabled(false);// There's only one option anyway.
    choice3.setEnabled(false);
    choice2.setVisible(false);
    choice3.setVisible(false);

    choice1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            setScene2();
        }
    });

}

private void setScene2() // CHARACTER GENERATION SCENE
{
    TITLE.setText("Character Generation");
    main.setEnabled(false); // Disable & Hide the main text window, as
                            // Chargen requires a nicer looking interface.
    main.setVisible(false);
    choice2.setEnabled(true);
    choice2.setVisible(true);
    choice1.setBounds(10, 600, 996, 34); //Resizing the bottom portion to fit two buttons
    choice2.setBounds(10, 645, 996, 34);
    choice1.setText("Continue");
    choice1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            // Nothing here for now
        }
    });
    choice2.setText("Back to the Title Screen");
    choice2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            main.setEnabled(true);
            main.setVisible(true);
            setScene1();
        }
    });

}


如果这两个方法继续互相调用,最终将耗尽内存:这是递归。如果你从不返回调用树,它就会变得任意深,直到boom出现。

如果这两个方法继续互相调用,你最终会耗尽你的内存:这是递归。如果您从未返回调用树,它只会变得任意深,直到爆炸。

您应该在构造函数或其他地方添加ActionListeners。通过这种方式,您可以在每次按下按钮时(即使相同)添加一个新的ActionListener。

您应该在构造函数或其他地方添加ActionListener。这样,每次按下按钮(即使是相同的按钮)都会添加一个新的ActionListener。

问题似乎在于每次切换场景时都会添加一个ActionListener。上一个ActionListener永远不会消失,但你会在上面堆积更多做同样事情的动作。每一个都执行相同的动作,所以当您按下切换场景时,它现在拥有的所有ActionListner也将转到切换场景。您的CPU将上升,因为现在有2^n个ActionListener正在等待输入,而内存中有那么多的ActionListener。

问题似乎在于每次切换场景时都要添加ActionListener。上一个ActionListener永远不会消失,但你会在上面堆积更多做同样事情的动作。每一个都执行相同的动作,所以当您按下切换场景时,它现在拥有的所有ActionListner也将转到切换场景。您的CPU将上升,因为现在有2^n个ActionListener等待输入,而内存中有那么多的ActionListener。

代码在哪里?如果没有它,那么就无法真正发挥作用。您能为我们展示level1()和level2()的
onClick
事件吗?我的第一个猜测是,您正在创建新对象,而不是重复使用已经存在的对象。如果你点击的次数足够多,你会得到很多
level1
level2
对象,但一次只有一个活动/可见的对象。对了,对不起。我现在又加了一些。我确实在重复使用对象。代码在哪里?如果没有它,那么就无法真正发挥作用。您能为我们展示level1()和level2()的
onClick
事件吗?我的第一个猜测是,您正在创建新对象,而不是重复使用已经存在的对象。如果你点击的次数足够多,你会得到很多
level1
level2
对象,但一次只有一个活动/可见的对象。对了,对不起。我现在又加了一些。我确实在重复使用对象。因此,从这一点和前面的答案来看,我只是在后台运行了大量不同的进程,它们什么都不做?我可以做些什么来终止这些方法吗?您可以使用组件的getActionListeners()方法,然后在每个方法上循环并执行removeActionListener()。这里有一个示例描述了如何执行此操作修复问题的更推荐的方法是仅在实例化ActionListener所附着的对象时添加ActionListener,而不是每次设置场景时。你的场景应该是两个不同的jlayer,它们有自己的组件,你可以将它们翻转过来,而不是每次都重写所有这些组件的属性。当然,谢谢你的建议。在使用getActionListeners和removeActionsListeners进行循环之后,我运行了这个程序,可以顺利地翻阅这两个菜单。一切都好,谢谢!从这个和前面的答案中,我得到了大量不同的进程在后台运行,它们什么都不做?我可以做些什么来终止这些方法吗?您可以使用组件的getActionListeners()方法,然后在每个方法上循环并执行removeActionListener()。这里有一个示例描述了如何执行此操作修复问题的更推荐的方法是仅在实例化ActionListener所附着的对象时添加ActionListener,而不是每次设置场景时。你的场景应该是两个不同的jlayer,它们有自己的组件,你可以将它们翻转过来,而不是每次都重写所有这些组件的属性。当然,谢谢你的建议。在使用getActionListeners和removeActionsListeners进行循环之后,我运行了这个程序,可以顺利地翻阅这两个菜单。一切都好,谢谢!