JUnit doesn't do forking as such, it leaves that to the things that invoke JUnit, such as Eclipse or Maven surefire.
Eclipse forks the jvm and then executes in the separate JVM, and communicates the result through a connection to the forked JVM.
Maven surefire has options where the user can control how and when to fork - it has different options for forking, see Maven Surefire - Fork Options and Parallel Test Execution.
One option would be to have a ForkingTestRunner, a TestRunner which forks. Then you could do the equivalent of @RunWith(ForkingTestRunner.class)
, which forks once per test method.
If this is still too slow, you could fork a runner, and communicate the results back through a socket or something to the monitor process. If the SUT crashes, then the monitor process detects this and fails the test and restarts the runner (but with a cut down list).
This way you'd only have one fork per set of tests, unless the SUT crashes a lot.