This repo demonstrates the dangers of using ruby_xmalloc
to allocation
memory inside a Ruby C extension. When ruby_xmalloc
fails, it raises a
NoMemoryError
exception which may be caught. This can leak memory.
Clone the repo and run ./runme.sh
on Linux. This demo uses ulimit -v
to
limit the amount of virtual memory applications can use. This doesn't work on
macOS.
Compiling
creating Makefile
linking shared-object memleak.so
Running without limits
Allocation 0...succeeded
Allocation 1...succeeded
Allocation 2...succeeded
Allocation 3...succeeded
Allocation 4...succeeded
Allocation 5...succeeded
Allocation 6...succeeded
Allocation 7...succeeded
Allocation 8...succeeded
Allocation 9...succeeded
Allocation 10...succeeded
Allocation 11...succeeded
Allocation 12...succeeded
Allocation 13...succeeded
Allocation 14...succeeded
Allocation 15...succeeded
Allocation 16...succeeded
Allocation 17...succeeded
Allocation 18...succeeded
Allocation 19...succeeded
Allocation 20...succeeded
Allocation 21...succeeded
Allocation 22...succeeded
Allocation 23...succeeded
Allocation 24...succeeded
Allocation 25...succeeded
Allocation 26...succeeded
Allocation 27...succeeded
Allocation 28...succeeded
Allocation 29...succeeded
Allocation 30...succeeded
Allocation 31...succeeded
Allocation 32...succeeded
Allocation 33...succeeded
Allocation 34...succeeded
Allocation 35...succeeded
Allocation 36...succeeded
Allocation 37...succeeded
Allocation 38...succeeded
Allocation 39...succeeded
Allocation 40...succeeded
Allocation 41...succeeded
Allocation 42...succeeded
Allocation 43...succeeded
Allocation 44...succeeded
Allocation 45...succeeded
Allocation 46...succeeded
Allocation 47...succeeded
Allocation 48...succeeded
Allocation 49...succeeded
Allocation 50...succeeded
Allocation 51...succeeded
Allocation 52...succeeded
Allocation 53...succeeded
Allocation 54...succeeded
Allocation 55...succeeded
Allocation 56...succeeded
Allocation 57...succeeded
Allocation 58...succeeded
Allocation 59...succeeded
Allocation 60...succeeded
Allocation 61...succeeded
Allocation 62...succeeded
Allocation 63...succeeded
Allocation 64...succeeded
Allocation 65...succeeded
Allocation 66...succeeded
Allocation 67...succeeded
Allocation 68...succeeded
Allocation 69...succeeded
Allocation 70...succeeded
Allocation 71...succeeded
Allocation 72...succeeded
Allocation 73...succeeded
Allocation 74...succeeded
Allocation 75...succeeded
Allocation 76...succeeded
Allocation 77...succeeded
Allocation 78...succeeded
Allocation 79...succeeded
Allocation 80...succeeded
Allocation 81...succeeded
Allocation 82...succeeded
Allocation 83...succeeded
Allocation 84...succeeded
Allocation 85...succeeded
Allocation 86...succeeded
Allocation 87...succeeded
Allocation 88...succeeded
Allocation 89...succeeded
Allocation 90...succeeded
Allocation 91...succeeded
Allocation 92...succeeded
Allocation 93...succeeded
Allocation 94...succeeded
Allocation 95...succeeded
Allocation 96...succeeded
Allocation 97...succeeded
Allocation 98...succeeded
Allocation 99...succeeded
Allocation 100...succeeded
Allocation 101...succeeded
Allocation 102...succeeded
Allocation 103...succeeded
Allocation 104...succeeded
Allocation 105...succeeded
Allocation 106...succeeded
Allocation 107...succeeded
Allocation 108...succeeded
Allocation 109...succeeded
Allocation 110...succeeded
Allocation 111...succeeded
Allocation 112...succeeded
Allocation 113...succeeded
Allocation 114...succeeded
Allocation 115...succeeded
Allocation 116...succeeded
Allocation 117...succeeded
Allocation 118...succeeded
Allocation 119...succeeded
Allocation 120...succeeded
Allocation 121...succeeded
Allocation 122...succeeded
Allocation 123...succeeded
Allocation 124...succeeded
Allocation 125...succeeded
Allocation 126...succeeded
Allocation 127...succeeded
Allocation 128...succeeded
Allocation 129...succeeded
Allocation 130...succeeded
Allocation 131...succeeded
Allocation 132...succeeded
Allocation 133...succeeded
Allocation 134...succeeded
Allocation 135...succeeded
Allocation 136...succeeded
Allocation 137...succeeded
Allocation 138...succeeded
Allocation 139...succeeded
Allocation 140...succeeded
Allocation 141...succeeded
Allocation 142...succeeded
Allocation 143...succeeded
Allocation 144...succeeded
Allocation 145...succeeded
Allocation 146...succeeded
Allocation 147...succeeded
Allocation 148...succeeded
Allocation 149...succeeded
Allocation 150...succeeded
Allocation 151...succeeded
Allocation 152...succeeded
Allocation 153...succeeded
Allocation 154...succeeded
Allocation 155...succeeded
Allocation 156...succeeded
Allocation 157...succeeded
Allocation 158...succeeded
Allocation 159...succeeded
Allocation 160...succeeded
Allocation 161...succeeded
Allocation 162...succeeded
Allocation 163...succeeded
Allocation 164...succeeded
Allocation 165...succeeded
Allocation 166...succeeded
Allocation 167...succeeded
Allocation 168...succeeded
Allocation 169...succeeded
Allocation 170...succeeded
Allocation 171...succeeded
Allocation 172...succeeded
Allocation 173...succeeded
Allocation 174...succeeded
Allocation 175...succeeded
Allocation 176...succeeded
Allocation 177...succeeded
Allocation 178...succeeded
Allocation 179...succeeded
Allocation 180...succeeded
Allocation 181...succeeded
Allocation 182...succeeded
Allocation 183...succeeded
Allocation 184...succeeded
Allocation 185...succeeded
Allocation 186...succeeded
Allocation 187...succeeded
Allocation 188...succeeded
Allocation 189...succeeded
Allocation 190...succeeded
Allocation 191...succeeded
Allocation 192...succeeded
Allocation 193...succeeded
Allocation 194...succeeded
Allocation 195...succeeded
Allocation 196...succeeded
Allocation 197...succeeded
Allocation 198...succeeded
Allocation 199...succeeded
Memory allocation succeeded
Try: ulimit -v 102400
Running with limits
Allocation 0...succeeded
Allocation 1...succeeded
Allocation 2...succeeded
Allocation 3...succeeded
Allocation 4...succeeded
Allocation 5...succeeded
Allocation 6...succeeded
Allocation 7...succeeded
Allocation 8...succeeded
Allocation 9...succeeded
Allocation 10...succeeded
Allocation 11...succeeded
Allocation 12...succeeded
Allocation 13...succeeded
Allocation 14...succeeded
Allocation 15...succeeded
Allocation 16...succeeded
Allocation 17...succeeded
Allocation 18...succeeded
Allocation 19...succeeded
Allocation 20...succeeded
Allocation 21...succeeded
Allocation 22...succeeded
Allocation 23...succeeded
Allocation 24...succeeded
Allocation 25...succeeded
Allocation 26...succeeded
Allocation 27...succeeded
Allocation 28...succeeded
Allocation 29...succeeded
Allocation 30...succeeded
Allocation 31...succeeded
Allocation 32...succeeded
Allocation 33...succeeded
Allocation 34...succeeded
Allocation 35...succeeded
Allocation 36...succeeded
Allocation 37...succeeded
Allocation 38...succeeded
Allocation 39...succeeded
Allocation 40...succeeded
Allocation 41...succeeded
Allocation 42...succeeded
Allocation 43...succeeded
Allocation 44...succeeded
Allocation 45...succeeded
Allocation 46...succeeded
Allocation 47...succeeded
Allocation 48...succeeded
Allocation 49...succeeded
Allocation 50...succeeded
Allocation 51...succeeded
Allocation 52...succeeded
Allocation 53...succeeded
Allocation 54...failed; leaked memory