2013-02-10 33 views
5

目前在Java中使用OpenGL进行实验。在NetBeans中运行以下测试代码几个周期后,我收到内存错误并且程序终止。在通过几个成功周期运行应用程序之后,问题就会发生一段时间。为什么NetBeans在我多次运行基于LWJGL的Java应用程序时声明内存不足?

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

代码:

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

在调试器中运行该程序。它应该告诉你到底发生了什么行内存不足异常。 – 2013-02-13 19:40:14

+0

是问题:netbeans为什么在低内存条件下停止? (有一个设置)。或者是问题:为什么会出现泄漏? (这是一个更棘手的问题。) – 2013-02-15 03:48:59

+0

@JoshDM程序运行好几次。每当我更改代码时,我都会运行代码以查看它是否正常工作,并且每次按'esc'关闭窗口。重复同样的操作一段时间后内存异常是发生 – varuog 2013-02-15 08:30:54

回答

6

这是一个known problem与NetBeans。

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

我知道与运行使用JNI的Web应用程序的Tomcat应用程序服务器类似的问题(see this SO question referencing it)。如果使用Tomcat管理员卸载并重新加载所述JNI访问Web应用程序,则JNI引用的DLL不会被卸载,并且在应用程序启动备份时遇到各种问题和冲突。在这种情况下正确的用法是完全停止Tomcat服务,然后再次启动Tomcat。它为希望使用管理员更新其JNI引用的可部署项目的人创造了难题;他们必须手动完成。

根据您的证据和the first link上,NetBeans也从这个问题受到影响,唯一的解决办法,其一是:一对夫妇的应用程序重新加载后

  • 重启IDE

    1. 没有重装所以往往你的应用程序
    2. 使用不同的IDE,它可能无法做到这一点(也许Eclipse?)
  • 1

    对我立了类似的内存问题nux Debian。

    下面是如何解决:

    1. 运行的终端
    2. 日志中作为根
    3. 类型crontab -e
    4. 滚动至底部或文件,并键入* * * * * sync; echo 3 > /proc/sys/vm/drop_caches

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

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

    相关问题