在Java中没有任何代码的情况下无限循环运行while循环

时间:2018-12-28 20:43:42

标签: java

可以说我写了一个无限的写循环,但是里面没有语句?它会不会产生任何问题,例如内存将满等,或者JVM会在一段时间后停止响应?

3 个答案:

答案 0 :(得分:1)

你为什么要那样做?

要回答,它不会消耗无休止的内存,但是如果根本没有任何指令,使用Cpu可能会很痛苦。

至少,您应该帮助CPU抢占,以允许线程产生:

Thread.yield();

您可以在Java Api Javadoc中阅读此内容:

  

向调度程序的提示,即当前线程愿意放弃对处理器的当前使用。调度程序可以随意忽略此提示。

     

Yield是一种启发式尝试,旨在提高线程之间的相对进程,否则将过度利用CPU。它的使用应与详细的性能分析和基准测试结合使用,以确保它实际上具有所需的效果。

     

很少使用此方法。它对于调试或测试目的可能是有用的,因为它可能有助于重现由于竞争条件而产生的错误。在设计并发控制结构(例如java.util.concurrent.locks包中的结构)时,它也可能很有用。

答案 1 :(得分:0)

无限循环可能并可能导致100%CPU核心利用率。根据您的“写循环”的意思,类似的技术称为Busy Waiting or Spinning

  

作为时间延迟技术的旋转通常会产生无法预测甚至不一致的结果,除非实施代码来确定处理器可以执行“不执行任何操作”循环的速度,或者循环代码明确检查实时时钟

答案 2 :(得分:0)

您肯定会让一个硬件线程忙。它不会创建任何对象,因此内存并不是直接的问题。

但是,上下文很重要。

  • 如果它是高优先级线程,则系统可能无响应。这是特定于实现的。二十年前,我写了一个无限循环,使Windows NT系统无法响应。 (我认为这是一个TCP代理,并且仅在运行CICS的IBM 3090向3270终端发送空的保持活动帧时发生。)
  • 如果线程持有任何锁,则不会释放该锁。
  • 如果线程执行了一些有用的操作,则该有用的操作将不会发生。例如,如果您要在终结器中编写循环(并且系统只有一个终结器线程),则其他任何对象都不会终结,因此也不会进行垃圾回收。该应用程序可能会表现异常。在终结器线程上运行随机代码总是很有趣。