我在Eclipse中收到了一个警告,其中包含以下代码:
代码:
Scanner money = new Scanner(System.in);
System.out.println(money.nextLine());
//money.close();
警告:
Description Resource Path Location Type
Resource leak: 'money' is never closed apples.java /SwordsNMoney/src line 6 Java P
这是什么警告以及资源泄漏'意思?
谢谢。
答案 0 :(得分:5)
资源泄漏 通常是一种错误的资源消耗模式,程序不会释放它已获取的资源。这可能会导致服务质量下降。
垃圾收集只能管理内存,而不能管理其他系统资源。如果您的Java程序有足够的可用内存,则不会自动触发垃圾收集。
所有操作系统都对可以打开的套接字,文件句柄等数量有限制。因此,对非内存资源的引用的无意维护可能导致资源泄漏。因此,管理非内存资源非常重要。
利用非内存资源的类应提供显式分配/释放这些资源的方法。我们需要明确地调用close()
方法来释放finally{}
中的文件描述符,因为它将执行是否抛出异常。
答案 1 :(得分:2)
Scanner
打开底层操作系统的文件描述符(或文件通道或流),通常以非托管(通常为C
语言)编写。
流保持打开状态,有时可以保持打开状态,直到内核决定关闭它(例如,在程序完成执行后......依赖于高度实现)。
因此明确关闭资源是一个好主意。
答案 2 :(得分:2)
你需要致电'关闭'关于IO类。
您可以使用try catch并最终阻止,在finally块中,您可以关闭扫描仪。
来自docs
关闭强>
如果此扫描仪尚未关闭,则表明其底层 read也实现了Closeable接口,然后是可读的接口 将调用close方法。如果此扫描仪已经关闭,那么 调用此方法将无效。
答案 3 :(得分:1)
可能是,底层资源(即文件描述符(在本例中为System.in))永远不会被释放,因此如果不正确关闭它就会被阻止。
据我所知,Java有一些处理机制可以自动关闭打开的扫描仪。有人对此有更多了解吗?
答案 4 :(得分:1)
泄漏一般定义为不会被垃圾收集。例如线程泄漏,对象泄漏 - 在这种情况下,线程占用的内存,对象不会被垃圾收集。
这里你没有关闭货币参考变量。所以引用不会被释放。所以它被称为Reference泄漏。