如何在可配置的时间内暂停执行JVM,类似于想要在完整的串行垃圾收集中发生?我想测试一些边缘情况但是很难通过手动生成垃圾+ System.gc()
来创建我需要的确切暂停。
我正在尝试“冻结”应用程序中的所有线程,以模拟应用程序无响应的情况,然后恢复执行。该应用程序是群集的一部分,我正在尝试调试一些离开/加入/重新加入问题。
答案 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
答案 2 :(得分:2)
使用虚拟机并完全暂停其执行。
答案 3 :(得分:1)
我认为你可能想要一些侵入性较小的东西,但一种方法是让一个控制线程获得一个锁,然后让所有其他线程也试图获得该锁。然后让控制线程在放弃之前睡眠所需的时间。稍微不那么笨拙的版本是使用每个线程一个允许的信号量,然后让控制线程获取所有这些,然后让所有其他线程尝试获取许可。
正如我所说的非常具有侵略性,你必须将其破解为每个线程的代码。
另一种方法是在调试器下运行代码并手动挂起每个线程。