It's an almost hilarious technique. In a garbage collected, multi-threaded virtual machine the runtime may at some point decide it is time for garbage collection. However, all threads must first be stopped because allocating memory while the garbage collector runs leads to badness and/or the garbage collector moves objects referenced by threads.
There is no direct way to signal to a thread that it should stop and having the thread poll some flag would hurt performance. Instead the compiler inserts dummy instructions (safepoints) at the top of every loop body or function entry point which writes to a page the runtime controls:
mov [addr], eax
Then when it's time to stop all threads, it just write protects the
page! Every thread eventually stumbles upon the bomb. Boom! SIGSEGV!
Boom! SIGSEGV! Boom! When every thread has exploded the garbage
collector can run in peace. Then the runtime removes the write
protection and resumes executing all threads. Something very similar
is used on Windows (though I think it's called events and not signals)
and sometimes you use read-protected pages rather than write-protected
ones, but the principle is the same.