暂停JVM一段有限的时间

时间:2010-04-20 10:33:32

标签: java jvm

如何在可配置的时间内暂停执行JVM,类似于想要在完整的串行垃圾收集中发生?我想测试一些边缘情况但是很难通过手动生成垃圾+ System.gc()来创建我需要的确切暂停。


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

4 个答案:

答案 0 :(得分:3)

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

在我的情况下(运行JBoss)我通过添加以下行来修改启动脚本:

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

然后在Eclipse中,运行 - >调试配置 - >删除Java应用程序 - >新

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

答案 1 :(得分:3)

JVM挂起可以通过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?

答案 2 :(得分:2)

使用虚拟机并完全暂停其执行。

答案 3 :(得分:1)

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

正如我所说的非常具有侵略性,你必须将其破解为每个线程的代码。

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