我怎样才能暂停JVM执行的时间配置量,类似于希望发生在一个完整,连续,垃圾回收?我想测试一些边缘情况,但很难创造我需要手动生成垃圾+ System.gc()
确切暂停。
我想“冻结”在应用程序中的所有线程,来模拟应用程序没有响应的情况,然后再继续执行。该应用程序是一个集群的一部分,我试图调试一些离开/加入/重新加入的问题。
当从Eclipse的调试,你可以暂停所有的线程,我想其他调试器允许这样做了。所以,你需要与JVM调试选项启动服务器和远程连接。
在我的情况下(运行JBoss)我加入这一行修改启动脚本:
set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n %JAVA_OPTS%
然后在Eclipse中运行 - >调试配置 - >删除Java应用程序 - >新建
通常情况下,你只需要提供主机名和端口。
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
使用虚拟机,并暂停其执行顾左右而言他。
我想你可能想要的东西,是创伤小,但一个方法是有一个控制线程获得一个锁,然后让所有其他线程也尝试获取锁。然后让你放弃它之前所需要的时间控制线程睡眠。这方面的一个略少笨拙的版本将能够将信号与每个线程一个许可证,然后有控制线程获得所有这些,让所有其他线程试图获取一个许可证。
就像我说的那是相当侵入你必须破解该到你为每个线程的代码。
另一种方法是将一个调试器下运行你的代码并手动中止每个线程。