I was unable to reproduce it on my mac OS + JDK 1.7, but was able to reproduce it on ubuntu:
java version "1.7.0_91"
OpenJDK Runtime Environment (IcedTea 2.6.3) (7u91-2.6.3-0ubuntu0.15.10.1)
OpenJDK 64-Bit Server VM (build 24.91-b01, mixed mode)
The frequency is about 1 out of 20 - 30 iterations. My strong suspicion is whether System.gc() would force the phantom reference to be enqueued in a timely manner. System.gc() itself is not deterministic (it's only a hint to the JVM after all), and the manner in which the garbage collector determines objects to be phantom-reachable seems to vary depending on the JVM/OS.
As Colin P. McCabe and Jason Lowe observed, simply increasing the wait time in this case doesn't seem to fix it.
I introduced a loop around GenericTestUtils.waitFor(), and if it times out I'm now forcing another System.gc() call and trying again. I can verify that we do hit that condition, and forcing another System.gc() call fixes it promptly. I ran the modified code 100 times on the problem OS/JVM combination, and it now passes all 100 times.
I'll post a patch shortly.