暂停JVM为在有限的时间量

问题描述 投票:2回答:4

我怎样才能暂停JVM执行的时间配置量,类似于希望发生在一个完整,连续,垃圾回收?我想测试一些边缘情况,但很难创造我需要手动生成垃圾+ System.gc()确切暂停。


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

java jvm
4个回答
3
投票

当从Eclipse的调试,你可以暂停所有的线程,我想其他调试器允许这样做了。所以,你需要与JVM调试选项启动服务器和远程连接。

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

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

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

通常情况下,你只需要提供主机名和端口。


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
投票

使用虚拟机,并暂停其执行顾左右而言他。


1
投票

我想你可能想要的东西,是创伤小,但一个方法是有一个控制线程获得一个锁,然后让所有其他线程也尝试获取锁。然后让你放弃它之前所需要的时间控制线程睡眠。这方面的一个略少笨拙的版本将能够将信号与每个线程一个许可证,然后有控制线程获得所有这些,让所有其他线程试图获取一个许可证。

就像我说的那是相当侵入你必须破解该到你为每个线程的代码。

另一种方法是将一个调试器下运行你的代码并手动中止每个线程。

© www.soinside.com 2019 - 2024. All rights reserved.