5

目前正在用 Java 中的 OpenGL 进行试验。在 NetBeans 中运行以下测试代码几个周期后,我收到内存不足错误,程序终止。在成功运行应用程序几个周期后,该问题会出现一段时间。

为什么会发生这种情况,如何解决?

代码:

package test3d;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.input.Keyboard;

class ColoredTriangle {
    public void start() {
        try {
            Display.setFullscreen(true);
            DisplayMode dm = new DisplayMode(34,34);
           // Display.setDisplayMode(new DisplayMode(DisplayMode.get));
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }

         // Init OpenGL
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(-3, 3, -2.4, 2.4, -1, 1);
        GL11.glRotatef(0.0f,5.0f,1.0f,0.0f); 
        //GL11.glOrtho(0, 640, 480, 0, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);

        boolean quit = false;

        while (!quit) {         
            // Clear the screen.
            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
            //GL11.glFrontFace(GL11.GL_CCW);
            // Begin drawing
            GL11.glBegin(GL11.GL_QUADS);
            GL11.glColor3f(1.0f,0.0f,0.0f); //Red   

     /*
                GL11.glVertex3f(0.0f,0.0f, 0.0f);

                GL11.glVertex3f(0.0f,1.0f, 0.0f);

                GL11.glVertex3f(1.0f,1.0f, 0.0f);

                GL11.glVertex3f(1.0f,0.0f, 0.0f); //*/


                 GL11.glVertex3f(1.0f,0.0f, -1f);

                GL11.glVertex3f(1.0f,1.0f, -1f);

                GL11.glVertex3f(2.0f,1.0f, -1f);

                GL11.glVertex3f(2.0f,0.0f, -1f);

              GL11.glEnd();  



            Display.update();

            if (Display.isCloseRequested() || Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
                quit = true;
        }

        Display.destroy();
        System.exit(0);
    }
}
class Test3d
{
    public static void main(String args[]) {
        ColoredTriangle ct = new ColoredTriangle();
        ct.start();
    }

}
4

2 回答 2

6

这是 NetBeans 的一个已知问题

NetBeans JVM 不会在每次回收后卸载 LWJGL DLL,每次执行应用程序时都会通过 LWJGL 通过 JNI 调用该 DLL。

我知道运行使用 JNI 的 Web 应用程序的 Tomcat 应用程序服务器存在类似问题(请参阅引用它的这个 SO 问题)。如果你使用Tomcat管理员卸载并重新加载所述访问JNI的Web应用程序,JNI引用的DLL不会被卸载,并且在应用程序启动备份时会遇到各种问题和冲突。在这种情况下,正确的用法是完全停止 Tomcat 服务,然后重新启动 Tomcat。对于那些想要使用管理员来更新他们的 JNI 引用部署的人来说,这让他们很头疼;他们必须手动完成。

根据您的证据和第一个链接,NetBeans 也遇到此问题,唯一的解决方法是:

  1. 不要经常重新加载您的应用程序
  2. 重新加载几次应用程序后重新启动 IDE
  3. 使用可能无法执行此操作的其他 IDE(可能是Eclipse?)
于 2013-02-15T13:25:30.423 回答
1

在我的 Linux Debian 上也有类似的内存问题。

以下是解决方法:

  1. 运行终端
  2. 以 root 身份登录
  3. 类型crontab -e
  4. 滚动到底部或文件并键入* * * * * sync; echo 3 > /proc/sys/vm/drop_caches

这条神奇的线路每分钟都会清除所有未使用的 ram。它删除了 NetBeans 正在产生的未使用内存(包括任何其他消耗内存的程序)。

这应该适用于大多数 UNIX 之类的操作系统。

于 2013-02-17T20:28:51.943 回答