代码之家  ›  专栏  ›  技术社区  ›  Robert Munteanu

在有限的时间内暂停JVM

  •  2
  • Robert Munteanu  · 技术社区  · 14 年前

    我如何能将JVM的执行暂停一段可配置的时间,类似于希望在完整的、串行的垃圾收集上发生的情况?我想测试一些边缘情况,但很难创建手动生成垃圾所需的确切暂停。+ System.gc() .


    我试图“冻结”应用程序中的所有线程,以模拟应用程序没有响应的情况,然后继续执行。应用程序是集群的一部分,我正在尝试调试一些离开/加入/重新加入的问题。

    4 回复  |  直到 5 年前
        1
  •  3
  •   Guillaume    14 年前

    当从Eclipse进行调试时,您可以支持所有线程,我猜其他调试程序也允许这样做。因此,您需要使用JVM调试选项启动服务器,并远程连接到它。

    在我的例子中(运行jboss),我通过添加以下行来修改启动脚本:

    set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n %JAVA_OPTS%
    

    然后在Eclipse、Run&Gt中调试配置-&删除Java应用程序-gt;

    通常只需要提供主机名和端口。

        2
  •  3
  •   Vadzim    5 年前

    可以从命令行通过 jdb :

    jdb -attach 8787
    Initializing jdb ...
    > suspend
    All threads suspended.
    > resume
    All threads resumed.
    > exit
    

    但这需要从 -Xdebug ...

    还有 universal way 要挂起和恢复Linux/Unix上的任何进程,请执行以下操作:

    kill -SIGSTOP PID
    kill -SIGCONT PID
    

    另请参见 How to suspend/resume a process in Windows?

        3
  •  2
  •   Robert Munteanu    14 年前

    使用虚拟机并直接暂停执行。

        4
  •  1
  •   Dean Povey    14 年前

    我认为您可能需要一些入侵性较小的东西,但是一种方法是让控制线程获取锁,然后让所有其他线程也尝试获取该锁。然后让控制线程休眠到您需要的时间,然后放弃它。稍微不那么笨拙的版本是,在让所有其他线程尝试获取许可证之前,使用一个信号量,每个线程一个许可证,然后让控制线程获取所有许可证。

    正如我所说的,这是非常有侵略性的,您必须将其侵入到每个线程的代码中。

    另一种方法是在调试器下运行代码并手动挂起每个线程。