You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java程序多次启动后逐渐变慢问题排查求助

问题分析与解决方案

首先可以明确:这不是JVM垃圾回收或内存堆的问题——因为重启IDE(也就是重启JVM进程)后问题依旧,说明泄漏的资源不在JVM托管的内存里,而是操作系统层面的本地资源,只有重启系统才能彻底释放这类资源。

核心原因:跨JVM实例的本地资源泄漏

LWJGL是基于OpenGL/GLFW等本地库的绑定,程序每次启动都会向操作系统申请GPU、窗口管理、硬件设备等系统级资源,如果退出时没正确释放,这些资源会被操作系统标记为“已占用”,多次启动累积后就会耗尽系统资源,导致整体运行变慢。常见的泄漏点包括:

  • OpenGL上下文/资源未销毁:
    程序关闭时没调用glDeleteTextures、glDeleteBuffers、glDeleteProgram等方法释放GPU对象,或者没正确终止OpenGL上下文,导致显存持续被占用,累积到一定程度后GPU性能下降。
  • GLFW窗口/句柄未清理:
    退出时没执行glfwDestroyWindow(window)销毁窗口实例,也没调用glfwTerminate()终止GLFW库,导致系统的窗口管理句柄、输入设备资源泄漏。
  • 其他本地资源泄漏:
    比如打开的本地文件、原生套接字没有关闭,JVM退出时操作系统没有自动回收这些资源(部分系统对这类资源的回收机制存在延迟)。

排查与修复步骤

  1. 完善程序退出逻辑
    确保在程序关闭(包括正常退出、异常退出)时执行完整的清理流程,示例代码:

    // 销毁OpenGL资源
    glDeleteTextures(textureID);
    glDeleteBuffers(bufferID);
    glDeleteProgram(shaderProgramID);
    // 销毁GLFW窗口
    glfwDestroyWindow(window);
    // 终止GLFW库
    glfwTerminate();
    // 确保JVM正常退出
    System.exit(0);
    

    注意:要处理异常场景(比如程序崩溃),可以通过添加关闭钩子来执行清理:

    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        // 这里执行清理逻辑
        glfwTerminate();
    }));
    
  2. 监控系统资源变化

    • Windows:打开任务管理器,切换到「性能」标签,监控GPU显存、进程句柄数;每次启动关闭程序后,观察这些指标是否持续上升且不回落。
    • Linux/macOS:用nvidia-smi(NVIDIA GPU)或glxinfo监控GPU资源,用lsof查看进程打开的文件句柄,确认是否存在资源泄漏。
  3. 启用LWJGL调试模式
    在程序启动参数中添加-Dorg.lwjgl.util.Debug=true和-Dorg.lwjgl.util.DebugLoader=true,LWJGL会在控制台输出资源泄漏的警告信息,帮助定位未释放的本地对象。

内容的提问来源于stack exchange,提问作者Captaincanadap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:12:41