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 をアンロードしません。この DLL は、アプリケーションの実行ごとに LWJGL を介して JNI 経由で呼び出されます。

JNIを使​​用するWebアプリケーションを実行しているTomcatアプリケーションサーバーで同様の問題を知っています(これを参照するSOの質問を参照してください)。Tomcat 管理者を使用して、JNI にアクセスする Web アプリケーションをアンロードして再ロードすると、JNI によって参照される DLL がアンロードされず、アプリケーションの再起動時にあらゆる種類の問題や競合が発生します。この場合の適切な使用法は、Tomcat サービスを完全に停止してから、Tomcat を再度開始することです。admin を使用して JNI 参照のデプロイ可能ファイルを更新したい人にとっては、頭の痛い問題です。手動で行う必要があります。

あなたの証拠と最初のリンクに基づいて、NetBeans もこの問題に悩まされており、唯一の回避策は次のいずれかです。

  1. アプリケーションを頻繁にリロードしない
  2. アプリケーションを数回リロードした後、IDE を再起動します。
  3. これを行わない可能性のある別の IDE を使用します (おそらくEclipse ?)
于 2013-02-15T13:25:30.423 に答える
1

私のLinux Debianでも同様のメモリの問題がありました。

これを修正する方法は次のとおりです。

  1. ターミナルを実行する
  2. ルートとしてログイン
  3. タイプcrontab -e
  4. 一番下またはファイルまでスクロールして入力します* * * * * sync; echo 3 > /proc/sys/vm/drop_caches

このマジック ラインは、未使用のすべての RAM を毎分クリアしました。NetBeans が生成していた未使用のメモリ (他のメモリを消費するプログラムを含む) を削除しました。

これは、OS のようなほとんどの UNIX で動作するはずです。

于 2013-02-17T20:28:51.943 に答える