2013-02-10 5 views
5

現在JavaでOpenGLを試しています。次のテストコードをNetBeans内で数サイクル実行すると、メモリ不足エラーが発生し、プログラムが終了します。問題は、いくつかの成功したサイクルでアプリケーションを実行した後、しばらくの間発生します。LWJGLベースのJavaアプリケーションを何度も実行すると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(); 
    } 

} 
+0

デバッガでプログラムを実行します。メモリ不足の例外が発生している行を正確に表示する必要があります。 –

+0

は質問です:低メモリ状態でネットビーンがなぜ停止していますか? (そのための設定があります)。それとも質問です:なぜ大騒ぎのリークがありますか? (それははるかに面倒な質問です) –

+0

@JoshDMプログラムは数回はうまく動作します。コードを変更するたびに、コードが動作しているかどうかを確認し、毎回「esc」を押してウィンドウを閉じます。同じ手順を何度か繰り返してメモリ例外が発生した場合 – varuog

答えて

6

これは、NetBeansとknown problemです。

NetBeans JVMは、アプリケーションの実行ごとにJNIからLWJGLを経由して呼び出されるリサイクルのたびに、LWJGL DLLをアンロードしません。

私はJNIを使​​用するWebアプリケーションを実行しているTomcatアプリケーションサーバーで同様の問題(see this SO question referencing it)を知っています。 Tomcat管理者を使用してJNIにアクセスするWebアプリケーションをアンロードしてリロードすると、JNIによって参照されるDLLはアンロードされず、アプリケーションのバックアップを開始するときにさまざまな問題や競合が発生します。この場合の適切な使い方は、Tomcatサービスを完全に停止してからTomcatを再起動することです。 JNIを参照するデプロイメントを更新するために管理者を使用したい人のために頭痛を引き起こします。彼らは手動でそれを行う必要があります。

あなたの証拠とthe first linkに基づいて、NetBeansはまた、この問題に苦しんでいるとだけ回避策はどちらかにある:

  1. はそれほど頻繁に
  2. アプリケーションを再ロードしないアプリケーションのリロードのカップルの後にIDEを再起動し
  3. これを実行しない場合があります別のIDEを使用します(おそらくEclipseを?)
1

は私の李上で同様のメモリの問題がありましたDebianをnuxします。ここで

はそれを修正する方法です:

  1. は、底部またはファイルへの
  2. ルートとしてタイプ crontab -e
  3. スクロールに
  4. 、端末のログを実行して、 * * * * * sync; echo 3 > /proc/sys/vm/drop_caches
を入力します

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

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

関連する問題