2013-02-10 12 views
5

Attualmente sto sperimentando OpenGL in Java. Dopo aver eseguito il seguente codice di test diversi cicli in NetBeans, ricevo un errore di memoria insufficiente e il programma termina. Il problema si verifica un po 'di tempo dopo aver eseguito l'applicazione attraverso alcuni cicli riusciti.Perché NetBeans dichiara bassa memoria quando eseguo un'applicazione Java basata su LWJGL più volte?

Perché ciò accade e come può essere risolto?

Codice:

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

Eseguire il programma nel debugger. Dovrebbe mostrare esattamente quale linea si sta verificando l'eccezione di memoria insufficiente. –

+0

è la domanda: perché i netbeans si fermano nella condizione di memoria insufficiente? (c'è un'impostazione per quello). O è la domanda: perché c'è una perdita di cose? (Questa è una domanda molto più complicata.) –

+0

@JoshDM Il programma viene eseguito per alcune volte bene. Ogni volta che cambio il codice eseguo il codice per vedere se funziona o meno e ogni volta che premo 'esc' per chiudere la finestra.Dopo aver ripetuto la stessa procedura, si verifica un'eccezione della memoria temporale – varuog

risposta

6

Questa è una known problem con NetBeans.

NetBeans JVM non sta scaricando la DLL LWJGL dopo ogni riciclo, che viene chiamato tramite JNI tramite LWJGL su ogni esecuzione dell'applicazione.

Conosco un problema simile (see this SO question referencing it) con Tomcat Application Server che esegue un'applicazione Web che utilizza JNI. Se si scarica e si ricarica la suddetta applicazione Web di accesso JNI utilizzando l'amministratore Tomcat, le DLL a cui fa riferimento JNI non vengono scaricate e si verificano tutti i tipi di problemi e conflitti all'avvio dell'applicazione. L'utilizzo corretto in questo caso consiste nel bloccare completamente il servizio Tomcat, quindi avviare nuovamente Tomcat. Crea mal di testa per coloro che desiderano utilizzare l'amministratore per aggiornare i propri prodotti di riferimento JNI; devono farlo manualmente.

Sulla base della sua evidenza e the first link, NetBeans soffre anche da questo problema e le uniche soluzioni sono a uno:

  1. non ricaricare l'applicazione in modo spesso
  2. riavvio l'IDE dopo un paio di ricarica applicazione
  3. usare un IDE diverso che potrebbe non fare questo (forse Eclipse?)
1

ha avuto un problema di memoria simile sul mio Li nux Debian.

Ecco come risolvere il problema:

  1. corsa un terminale
  2. il login come root
  3. tipo crontab -e
  4. scorrere verso il basso o il file e digitare * * * * * sync; echo 3 > /proc/sys/vm/drop_caches

Questa linea magica ha cancellato ogni ram inutilizzato ogni minuto. Ha rimosso la memoria non utilizzata che NetBeans stava producendo (inclusi altri programmi che consumano memoria).

Questo dovrebbe funzionare sulla maggior parte dei SO di UNIX.

Problemi correlati