Peter, I looked at Cleaner by curiosity and it seems to be not catching the oome from thunk.run !
If oome1 is thrown by thunk.run at line 150 then it is catched at line 157 but your new try/catch block (oome2) only encapsulates the doPriviledge block. If this block also throws a new oome2 due to the first oome1 (no memory left), it will work but I would have prefered a more explicit solution and check oome1 first ... My 2 cents (I am not a reviewer). Laurent