当前正在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();
}
}
这是NetBeans的一个已知问题。
NetBeans JVM在每次回收后都不会卸载LWJGL DLL,这是在应用程序的每次执行中通过JNI通过LWJGL调用的。
我知道TomcatApplicationServer运行一个使用JNI的web应用程序时也有类似的问题(请参阅引用它的SO问题)。如果使用Tomcat管理员卸载并重新加载所述JNI访问web应用程序,则JNI引用的DLL不会卸载,并且在启动备份应用程序时会遇到各种问题和冲突。在这种情况下,正确的用法是完全停止Tomcat服务,然后再次启动Tomcat。对于那些想要使用管理员来更新其JNI引用可部署程序的人来说,这会带来麻烦;他们必须手动操作。
根据你的证据和第一个链接,NetBeans也遇到了这个问题,唯一的解决办法是:
- 不要经常重新加载应用程序
- 重新加载几个应用程序后重新启动IDE
- 使用可能无法做到这一点的其他IDE(也许是Eclipse?)
在我的Linux Debian上也有类似的内存问题。
以下是修复方法:
- 运行终端
- 以root身份登录
- 类型
crontab -e
- 滚动到文件底部并键入
* * * * * sync; echo 3 > /proc/sys/vm/drop_caches
这条魔法线每分钟清除所有未使用的ram。它删除了NetBeans正在生成的未使用的内存(包括任何其他消耗内存的程序)。
这应该适用于大多数类似UNIX的操作系统。