Linux java本机内存泄漏故障排除

Linux java本机内存泄漏故障排除,linux,java,Linux,Java,我注意到我运行的java应用程序会泄漏内存(没有封顶,速度很快,可以在10分钟内占用所有内存,并强制激活交换,这会影响性能)。我知道这样的问题不会影响其他用户(包括至少一个linux用户),所以最有可能的问题不是在应用程序中,而是在软件中(jvm和libs,驱动程序)。应用程序需要java 8,这个问题在openjdk和oracle java上都存在。我无法修改应用程序,似乎我无法影响应用程序的启动方式(它是由另一个java应用程序更新和启动的,从ps获取cmdline并手动启动它不起作用(它崩

我注意到我运行的java应用程序会泄漏内存(没有封顶,速度很快,可以在10分钟内占用所有内存,并强制激活交换,这会影响性能)。我知道这样的问题不会影响其他用户(包括至少一个linux用户),所以最有可能的问题不是在应用程序中,而是在软件中(jvm和libs,驱动程序)。应用程序需要java 8,这个问题在openjdk和oracle java上都存在。我无法修改应用程序,似乎我无法影响应用程序的启动方式(它是由另一个java应用程序更新和启动的,从
ps
获取cmdline并手动启动它不起作用(它崩溃)),因此我无法连接java代理(某些探查器需要它,不确定是否需要探查器),但我可以使用ltrace和类似的实用程序连接到进程。我检查了进程内存映射,发现泄漏由映射到
/dev/dri/render128
的1mb区域组成(新的区域出现,旧的区域仍然存在),所以问题可能与图形驱动程序有关(但我已将驱动程序更新为实际版本(ubuntu的padoka ppa),并且问题仍然存在)。我发现了一些关于openjfx内存泄漏的错误报告(此应用程序中使用了javafx),但建议的解决方法不起作用。不确定它是否有用,但我在使用
ltrace
时也注意到了segfault信号,这些信号不会使应用程序崩溃,而且它们的外观似乎与所提到的
/dev/dri/render128
区域的外观有关


  • 我怎样才能缩小问题的范围(这样我就知道到底是什么导致了它,这样我就可以修复它或者提交bugreport之类的东西)
  • 是否有可能通过外力来释放内存的某些区域,如果有,是如何做到的?(我猜难看的解决办法是监视这些区域的外观,并偶尔将其删除)


  • 如果需要,我可以提供有关我使用的硬件和软件的更多详细信息

    您可以尝试使用命令行选项来控制垃圾收集(请参阅)和内存分配(请参阅)。我使用的Java应用程序需要内存管理,例如,-Xmx1G。这是本机内存泄漏(不在jvm堆中),因此调整垃圾收集不会有帮助,启动应用程序的cmdline中提供了提到的选项。您尝试过更改它们吗?没有,但再次,这不是堆内泄漏。如果问题是
    /dev/dri/render*
    映射的增加,那么这暗示图形资源没有正确释放,所以我不会称之为“内存泄漏”。如果您有源代码并且对它们有点熟悉,请尝试删除这些内容,直到问题消失,这样您就可以缩小范围,了解哪些特定资源没有正确发布。如果问题出在某个库/驱动程序中,并且您需要生成错误报告,那么这种行为的一个最简单的示例确实会有所帮助。您可以尝试使用命令行选项来控制垃圾收集(请参阅)和内存分配(请参阅)。我使用的Java应用程序需要内存管理,例如,-Xmx1G。这是本机内存泄漏(不在jvm堆中),因此调整垃圾收集不会有帮助,启动应用程序的cmdline中提供了提到的选项。您尝试过更改它们吗?没有,但再次,这不是堆内泄漏。如果问题是
    /dev/dri/render*
    映射的增加,那么这暗示图形资源没有正确释放,所以我不会称之为“内存泄漏”。如果您有源代码并且对它们有点熟悉,请尝试删除这些内容,直到问题消失,这样您就可以缩小范围,了解哪些特定资源没有正确发布。如果问题出现在某个库/驱动程序中,并且您需要生成错误报告,那么这种行为的一个最简单的示例确实会有所帮助。