如何在Java中发现打开的文件描述符?

如何在Java中发现打开的文件描述符?,java,amazon-web-services,aws-lambda,Java,Amazon Web Services,Aws Lambda,我遇到过这样一种情况:我们有一个用Java编写的AWS Lambda,它通常会耗尽文件描述符。AWS Lambda的文件描述符限制为1024个。我们似乎经常达到这个极限,但不确定为什么。 有一件事我们不确定:如果一个java lambda泄漏了一个资源,那么它的容器将被挂起,然后重新水合,这些泄漏的资源会保留下来还是调用会收到一个全新的沙箱 我们相信我们可能有一个资源泄漏,这是对lambda的幸存调用。如果我们对lambda进行更改(如部署新版本、更改环境变量等),那么文件描述符问题似乎会暂时消

我遇到过这样一种情况:我们有一个用Java编写的AWS Lambda,它通常会耗尽文件描述符。AWS Lambda的文件描述符限制为1024个。我们似乎经常达到这个极限,但不确定为什么。 有一件事我们不确定:如果一个java lambda泄漏了一个资源,那么它的容器将被挂起,然后重新水合,这些泄漏的资源会保留下来还是调用会收到一个全新的沙箱

我们相信我们可能有一个资源泄漏,这是对lambda的幸存调用。如果我们对lambda进行更改(如部署新版本、更改环境变量等),那么文件描述符问题似乎会暂时消失

lambda的本质非常简单,它由一个kinesis事件调用,从s3 bucket读取,提取一些信息,然后写入dynamo表。我们已经进行了广泛的检查,以确保我们正在关闭所有资源,因此我们实际上认为,如果存在资源泄漏,它可能位于我们正在使用的一个依赖项中


有没有一种简单的方法可以从代码中看出哪些文件描述符与java应用程序相关联,哪些文件描述符本身不打开另一个描述符?

很难相信lambda在调用之间仍然存在。我认为您可能忽略了一个事实,即套接字也是文件描述符——m.b.您没有正确关闭套接字(例如数据库连接?)。不,我知道套接字是文件描述符。这也是为什么我要求在不打开另一个描述符的情况下进行检查——例如,在java中运行shell命令将创建一个新的管道描述符。我们知道,有些事情确实存在:“Lambda函数代码中的任何声明(在处理程序代码之外,请参见编程模型)都保持初始化状态,在再次调用函数时提供额外的优化”(请参见:)。但不确定这是否扩展到描述符。那么,运行shell命令有什么问题?当然,它需要一个文件描述符,但不要等到出现错误后才这样做,要一直这样做,看看哪些文件描述符在用完之前没有关闭。很难相信lambda在调用之间仍然存在。我认为您可能忽略了一个事实,即套接字也是文件描述符——m.b.您没有正确关闭套接字(例如数据库连接?)。不,我知道套接字是文件描述符。这也是为什么我要求在不打开另一个描述符的情况下进行检查——例如,在java中运行shell命令将创建一个新的管道描述符。我们知道,有些事情确实存在:“Lambda函数代码中的任何声明(在处理程序代码之外,请参见编程模型)都保持初始化状态,在再次调用函数时提供额外的优化”(请参见:)。但不确定这是否扩展到描述符。那么,运行shell命令有什么问题?当然,它需要一个文件描述符,但不要等到你收到错误后才去做,一直这样做,看看哪些文件描述符在你用完之前没有关闭。