2010-04-20 89 views
2

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


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

+0

不确定你在做什么。简单的睡眠()会起作用吗? – 2010-04-20 13:25:11

+0

@Romain:查看我的问题更新。 – 2010-04-20 13:43:22

+0

你最终回答了你自己的问题? :) 有没有机会碰到关于如何从内部怀疑JVM本身的信息?我现在需要这个解决方案。 :) – 2010-07-31 02:52:33

回答

2

使用虚拟机并彻底挂起其执行。

1

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

正如我所说,这是非常有侵略性的,你必须将其转化为每个线程的代码。

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

+0

谢谢你的回答。我正在寻找锁定所有线程的东西,包括一些由第三方代码控制的线程。 – 2010-04-20 14:23:22

+0

稍微更复杂的方法可能是使用JPDA api编写自己的调试器,它枚举线程并暂停它们。 – 2010-04-20 14:53:05

+0

听起来很有趣。我在jdb中没有找到与此相关的任何内容。你有没有关于如何完成的指示? – 2010-04-20 15:05:42

3

从Eclipse进行调试时,您可以取消所有线程,我想其他调试器也可以这样做。所以你需要使用JVM调试选项启动服务器并远程连接它。

在我的情况(运行JBoss)我加入这一行修改启动脚本:在Eclipse中运行

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

然后 - >调试配置 - >删除Java应用程序 - >新建

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

+0

谢谢,我正在考虑这一点。你碰巧知道如何在没有Eclipse的情况下做到这一点? – 2010-04-20 14:18:42

+0

然后你可以设置一个断点并做任何事情 – 2010-04-20 14:19:15

1

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 
相关问题