2013-02-10 18 views
5

Obecnie eksperymentuję z OpenGL w Javie. Po uruchomieniu następującego kodu testowego kilka cykli w NetBeans, otrzymuję błąd niskiej pamięci i program się kończy. Problem występuje po pewnym czasie po uruchomieniu aplikacji przez kilka udanych cykli.Dlaczego NetBeans deklaruje niską pamięć po kilkukrotnym uruchomieniu aplikacji Java opartej na LWJGL?

Dlaczego tak się dzieje i jak można to naprawić?

Kod:

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

Uruchom program w debugerze. Powinien pokazać dokładnie, w której linii występuje wyjątek pamięci. –

+0

jest pytanie: dlaczego netbeans zatrzymuje się na stanie niskiej pamięci? (jest na to ustawienie). Czy też jest pytanie: dlaczego istnieje przeciek menoryalny? (to jest znacznie trudniejsze pytanie). –

+0

@JoshDM Program działa kilka razy dobrze. Za każdym razem, gdy zmieniam kod, uruchamiam kod, aby sprawdzić, czy działa, czy też nie i za każdym razem, gdy wciskam "esc", zamykam okno.Po powtórzeniu tej samej procedury pojawia się wyjątek pamięci czasu: – varuog

Odpowiedz

6

To known problem z NetBeans.

JVM NetBeans nie rozładowuje biblioteki DLL LWJGL po każdym ponownym uruchomieniu, która jest wywoływana przez JNI do LWJGL przy każdym uruchomieniu aplikacji.

Znam podobny problem (see this SO question referencing it) z serwerem aplikacji Tomcat, na którym działa aplikacja internetowa wykorzystująca JNI. Jeśli wyładujesz i ponownie załadujesz wspomnianą aplikację WWW korzystającą z JNI za pomocą administratora Tomcat, biblioteki DLL, do których odwołuje się JNI, nie zostaną rozładowane i napotkane zostaną wszystkie problemy i konflikty po uruchomieniu kopii zapasowej aplikacji. Właściwe użycie w tym przypadku polega na całkowitym zatrzymaniu usługi Tomcat, a następnie ponownym uruchomieniu Tomcat. Stwarza to ból głowy dla tych, którzy chcą użyć administratora, aby zaktualizować swoje stanowiska do odwoływania się do JNI; muszą to zrobić ręcznie.

Na podstawie dowodów i the first link, NetBeans również cierpi z tego problemu, a jedynie ich obejścia są albo:

  1. nie przeładować aplikację tak często
  2. restart IDE po kilku załadunków aplikacyjnych
  3. użyć innego IDE, które nie mogą zrobić to (być może Eclipse?)
1

miał podobny problem w mojej pamięci Li nux Debian.

Oto jak to naprawić:

  1. uruchomić terminal
  2. zalogować się jako użytkownik root
  3. typu crontab -e
  4. przewijania do dołu lub pliku i wpisz * * * * * sync; echo 3 > /proc/sys/vm/drop_caches

Ta magiczna linia usuwała wszystkie nieużywane RAMy co minutę. Usunięto nieużywaną pamięć, którą produkował NetBeans (w tym wszelkie inne programy zużywające pamięć).

Powinno to działać w większości systemów UNIX, takich jak OS.