【问题标题】:Why we should I close a java.util.Scanner variable? [duplicate]为什么我们要关闭 java.util.Scanner 变量? [复制]
【发布时间】:2014-08-25 17:18:56
【问题描述】:

我在 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

这个警告是什么?“资源泄漏”是什么意思?

谢谢。

【问题讨论】:

标签: java


【解决方案1】:

资源泄漏 通常是一种错误的资源消耗模式,即程序没有释放它已获取的资源。这可能会导致服务质量不佳。

垃圾回收只能管理内存,不能管理其他系统资源。如果您的 Java 程序有足够的可用内存,则不会自动触发垃圾回收。

所有操作系统对可以打开的套接字、文件句柄等的数量都有限制。因此,无意维护对非内存资源的引用可能导致资源泄漏。所以管理非内存资源是极其重要的。

使用非内存资源的类应该提供显式分配/释放这些资源的方法。我们需要显式调用close() 方法来释放finally{} 中的文件描述符,因为无论是否抛出异常都会执行。

【讨论】:

  • java.util.Scanner 钱;这里的钱是一个变量或一个对象,用大量可用内存代替垃圾回收是什么意思?
  • 首先,money 在这里是一个引用变量,直到我们使用new 创建一个对象,一旦创建对象,它将持有该对象的引用,其次,关于可用内存,首先你应该知道 JVM内存或堆分为年轻代、老代和永久代3部分。只要年轻一代区域是免费的,垃圾收集就不会发生Refer this
  • 大量可用内存意味着年轻一代区域并不急于所有对象都在做他们的工作并收集垃圾
【解决方案2】:

泄漏一般定义为不被垃圾收集。例子是线程泄漏,对象泄漏-在这种情况下线程占用内存,对象不会被垃圾收集。

这里你没有关闭货币参考变量。所以参考没有被释放。所以它被称为参考泄漏。

【讨论】:

    【解决方案3】:

    可能是,底层资源,即文件描述符(在本例中为 System.in)永远不会被释放,因此如果您没有正确关闭它,则会被阻止。

    据我所知,Java 有某种处理机制可以自动关闭打开的扫描程序。有人知道更多吗?

    【讨论】:

      【解决方案4】:

      您需要在 IO 类上调用“关闭”。

      你可以使用 try catch 和 finally 块,在 finally 块中你可以关闭扫描器。

      来自docs

      关闭

      如果这个扫描器还没有关闭,那么如果它的底层 readable 还实现了 Closeable 接口,然后是 readable 的 将调用 close 方法。如果此扫描仪已关闭,则 调用此方法将无效。

      【讨论】:

        【解决方案5】:

        Scanner 打开底层操作系统的文件描述符(或文件通道,或流),通常以非托管(通常为C 语言)编写。

        一个流保持打开,有时可以保持打开直到内核决定关闭它(例如,在程序完成执行之后......高度依赖于实现)。

        因此,明确关闭资源是个好主意。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-27
          • 1970-01-01
          • 1970-01-01
          • 2019-05-27
          • 1970-01-01
          • 2012-09-08
          • 1970-01-01
          • 2016-09-24
          相关资源
          最近更新 更多