{"id":13879442,"url":"https://github.com/ko1/nakayoshi_fork","last_synced_at":"2025-04-10T04:54:24.866Z","repository":{"id":56885079,"uuid":"41161069","full_name":"ko1/nakayoshi_fork","owner":"ko1","description":null,"archived":false,"fork":false,"pushed_at":"2020-01-28T16:33:51.000Z","size":8,"stargazers_count":82,"open_issues_count":3,"forks_count":7,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-24T06:08:13.982Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ko1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-08-21T14:43:58.000Z","updated_at":"2024-06-04T04:51:26.000Z","dependencies_parsed_at":"2022-08-21T00:50:11.508Z","dependency_job_id":null,"html_url":"https://github.com/ko1/nakayoshi_fork","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ko1%2Fnakayoshi_fork","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ko1%2Fnakayoshi_fork/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ko1%2Fnakayoshi_fork/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ko1%2Fnakayoshi_fork/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ko1","download_url":"https://codeload.github.com/ko1/nakayoshi_fork/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248161253,"owners_count":21057553,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-06T08:02:21.242Z","updated_at":"2025-04-10T04:54:24.834Z","avatar_url":"https://github.com/ko1.png","language":"Ruby","funding_links":[],"categories":["Ruby","High Performance Libraries"],"sub_categories":["Application Insights"],"readme":"# NakayoshiFork\n\nnakayoshi_fork gem solves CoW friendly problem on MRI 2.2 and later.\n\n## Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'nakayoshi_fork'\n```\n\nAnd then execute:\n\n    $ bundle\n\nOr install it yourself as:\n\n    $ gem install nakayoshi_fork\n\n## Usage\n\nYou only need to `require \"nakayoshi_fork\"`.\n\nIf you want to disable nakayoshi-fork, then use `fork(nakayoshi: false)` or `fork(cow_friendly: false)`.\n\n## Mechanism\n\nMRI 2.1 employs generational GC algorithms that separate YOUNG objects and OLD objects.\nYoung objects will be promoted to old objects when they survive 1 GC.\nAfter surviving 1 GC, set OLD bit for each young objects. So that we can recognize the promoted objects are old objects.\nMRI 2.1 uses bitmap for the old object bit and it is CoW friendly.\n\nHowever, Ruby 2.2 employs an algorithm to promote young objects after 3 GCs.\nTo count GC surviving number, all of objects have *age* field per objects (2 bits field to count 0 to 3).\nCreated objects are age 0, and age 3 objects are promoted (old) objects.\n\nUnfortunately, age fileds are embed to object header, so that when there are many young objects,\nbut promoted soon is problem because their object headers are written and mark as dirty page.\nThis is why MRI 2.2 has CoW friendly problem on fork.\n\nnakayoshi_fork gem promotes most of young objects before fork by invoking GC some times.\n\n### Result:\n\nThe following results are tests using nakayoshi-fork on my environment (2GB 64bit CPU Ubuntu machine).\n\nTest script is here:\n\n```ruby\n# make 2**(n+1) ary\ndef make_obj n\n  if n \u003e 0\n    [make_obj(n-1), make_obj(n-1)]\n  else\n    []\n  end\nend\n\ndef object_count\n  b = GC.stat[:total_allocated_objects] || GC.stat[:total_allocated_object]\n  yield\n  a = GC.stat[:total_allocated_objects] || GC.stat[:total_allocated_object]\n  a - b\nend\n\ncreated = object_count{\n  $objs = make_obj(21) # 4M objects -\u003e 4M * 40B = 160MB\n}\n\nputs \"created #{created} objects, consumed: #{created * 40 / (1024 * 1024)} MB\"\n\ndef mem_usage\n  _, total, used, free = `free -m -o | grep Mem`.split(/\\s+/)\n  {total_mem: total, used_mem: used, free_mem: free}\nend\n\n# make 10 processes\n10.times{\n  fork{\n    puts 'before gc: ' + mem_usage.inspect\n    sleep 5\n    puts :GC\n    GC.start\n    sleep 5\n    puts 'after gc :' + mem_usage.inspect\n    sleep 5\n  }\n}\n10.times{Process.wait}\nputs 'after terminate all processes: ' + mem_usage.inspect\n```\n\nWithout nakayoshi-fork:\n\n```\nruby 2.0.0p402 (2014-02-11) [x86_64-linux]\ncreated 4194305 objects, consumed: 160 MB\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"386\", :free_mem=\u003e\"1615\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"390\", :free_mem=\u003e\"1611\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"391\", :free_mem=\u003e\"1610\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"392\", :free_mem=\u003e\"1609\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"392\", :free_mem=\u003e\"1609\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"392\", :free_mem=\u003e\"1609\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"394\", :free_mem=\u003e\"1607\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"394\", :free_mem=\u003e\"1607\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"394\", :free_mem=\u003e\"1607\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"393\", :free_mem=\u003e\"1607\"}\n...\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"421\", :free_mem=\u003e\"1580\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"422\", :free_mem=\u003e\"1579\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"425\", :free_mem=\u003e\"1576\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"425\", :free_mem=\u003e\"1576\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"424\", :free_mem=\u003e\"1576\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"424\", :free_mem=\u003e\"1577\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"422\", :free_mem=\u003e\"1579\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"423\", :free_mem=\u003e\"1578\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"423\", :free_mem=\u003e\"1578\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"423\", :free_mem=\u003e\"1578\"}\nafter terminate all processes: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"385\", :free_mem=\u003e\"1616\"}\n\nruby 2.1.5p312 (2015-03-10 revision 49912) [x86_64-linux]\ncreated 4194305 objects, consumed: 160 MB\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"308\", :free_mem=\u003e\"1693\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"309\", :free_mem=\u003e\"1692\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"313\", :free_mem=\u003e\"1688\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"312\", :free_mem=\u003e\"1689\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"313\", :free_mem=\u003e\"1688\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"313\", :free_mem=\u003e\"1688\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"313\", :free_mem=\u003e\"1688\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"315\", :free_mem=\u003e\"1686\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"314\", :free_mem=\u003e\"1686\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"314\", :free_mem=\u003e\"1686\"}\n...\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"585\", :free_mem=\u003e\"1416\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"587\", :free_mem=\u003e\"1414\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"587\", :free_mem=\u003e\"1414\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"587\", :free_mem=\u003e\"1414\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"586\", :free_mem=\u003e\"1415\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"586\", :free_mem=\u003e\"1415\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"586\", :free_mem=\u003e\"1415\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"586\", :free_mem=\u003e\"1415\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"586\", :free_mem=\u003e\"1415\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"586\", :free_mem=\u003e\"1415\"}\nafter terminate all processes: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"307\", :free_mem=\u003e\"1694\"}\n\nruby 2.2.3p134 (2015-06-15 revision 50899) [x86_64-linux]\ncreated 4194304 objects, consumed: 160 MB\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"319\", :free_mem=\u003e\"1682\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"321\", :free_mem=\u003e\"1680\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"325\", :free_mem=\u003e\"1675\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"335\", :free_mem=\u003e\"1666\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"330\", :free_mem=\u003e\"1671\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"351\", :free_mem=\u003e\"1650\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"351\", :free_mem=\u003e\"1650\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"353\", :free_mem=\u003e\"1648\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"354\", :free_mem=\u003e\"1647\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"354\", :free_mem=\u003e\"1647\"}\n...\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1300\", :free_mem=\u003e\"701\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1300\", :free_mem=\u003e\"701\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1300\", :free_mem=\u003e\"701\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1302\", :free_mem=\u003e\"699\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1301\", :free_mem=\u003e\"700\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1302\", :free_mem=\u003e\"699\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1301\", :free_mem=\u003e\"699\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1301\", :free_mem=\u003e\"699\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1301\", :free_mem=\u003e\"700\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1300\", :free_mem=\u003e\"700\"}\nafter terminate all processes: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"307\", :free_mem=\u003e\"1693\"}\n\nruby 2.3.0dev (2015-08-16 trunk 51564) [x86_64-linux]\ncreated 4194304 objects, consumed: 160 MB\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"310\", :free_mem=\u003e\"1691\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"310\", :free_mem=\u003e\"1691\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"310\", :free_mem=\u003e\"1691\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"312\", :free_mem=\u003e\"1689\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"311\", :free_mem=\u003e\"1690\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"314\", :free_mem=\u003e\"1687\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"315\", :free_mem=\u003e\"1686\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"314\", :free_mem=\u003e\"1687\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"316\", :free_mem=\u003e\"1685\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"316\", :free_mem=\u003e\"1685\"}\n...\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1268\", :free_mem=\u003e\"732\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1269\", :free_mem=\u003e\"732\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1269\", :free_mem=\u003e\"732\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1269\", :free_mem=\u003e\"732\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1270\", :free_mem=\u003e\"731\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1270\", :free_mem=\u003e\"731\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1270\", :free_mem=\u003e\"731\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1270\", :free_mem=\u003e\"731\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1269\", :free_mem=\u003e\"731\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"1269\", :free_mem=\u003e\"732\"}\nafter terminate all processes: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"308\", :free_mem=\u003e\"1693\"}\n```\n\nYou can see Ruby 2.2 and Ruby 2.3 consume memory after fork+GC.\n\nUsing nakayoshi-fork:\n\n```\nruby 2.0.0p402 (2014-02-11) [x86_64-linux]\ncreated 4194305 objects, consumed: 160 MB\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"391\", :free_mem=\u003e\"1610\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"394\", :free_mem=\u003e\"1607\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"394\", :free_mem=\u003e\"1607\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"395\", :free_mem=\u003e\"1606\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"397\", :free_mem=\u003e\"1604\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"396\", :free_mem=\u003e\"1605\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"397\", :free_mem=\u003e\"1604\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"396\", :free_mem=\u003e\"1604\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"397\", :free_mem=\u003e\"1604\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"396\", :free_mem=\u003e\"1605\"}\n...\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"427\", :free_mem=\u003e\"1574\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"426\", :free_mem=\u003e\"1575\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"426\", :free_mem=\u003e\"1575\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"425\", :free_mem=\u003e\"1575\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"425\", :free_mem=\u003e\"1575\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"426\", :free_mem=\u003e\"1575\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"425\", :free_mem=\u003e\"1575\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"426\", :free_mem=\u003e\"1575\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"426\", :free_mem=\u003e\"1575\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"426\", :free_mem=\u003e\"1575\"}\nafter terminate all processes: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"388\", :free_mem=\u003e\"1613\"}\n\nruby 2.1.5p312 (2015-03-10 revision 49912) [x86_64-linux]\ncreated 4194305 objects, consumed: 160 MB\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"310\", :free_mem=\u003e\"1690\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"313\", :free_mem=\u003e\"1688\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"315\", :free_mem=\u003e\"1685\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"315\", :free_mem=\u003e\"1686\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"317\", :free_mem=\u003e\"1683\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"317\", :free_mem=\u003e\"1683\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"318\", :free_mem=\u003e\"1683\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"318\", :free_mem=\u003e\"1683\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"318\", :free_mem=\u003e\"1683\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"318\", :free_mem=\u003e\"1683\"}\n...\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1638\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1638\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1638\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1638\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1638\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1638\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1638\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1637\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1638\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"363\", :free_mem=\u003e\"1638\"}\nafter terminate all processes: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"310\", :free_mem=\u003e\"1691\"}\n\nruby 2.2.3p134 (2015-06-15 revision 50899) [x86_64-linux]\ncreated 4194304 objects, consumed: 160 MB\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"311\", :free_mem=\u003e\"1690\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"311\", :free_mem=\u003e\"1690\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"314\", :free_mem=\u003e\"1687\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"315\", :free_mem=\u003e\"1686\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"315\", :free_mem=\u003e\"1686\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"317\", :free_mem=\u003e\"1684\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"317\", :free_mem=\u003e\"1684\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"318\", :free_mem=\u003e\"1683\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"318\", :free_mem=\u003e\"1683\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"318\", :free_mem=\u003e\"1683\"}\n...\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"368\", :free_mem=\u003e\"1633\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"368\", :free_mem=\u003e\"1633\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"368\", :free_mem=\u003e\"1633\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"368\", :free_mem=\u003e\"1633\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"368\", :free_mem=\u003e\"1633\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"368\", :free_mem=\u003e\"1633\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"368\", :free_mem=\u003e\"1633\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"369\", :free_mem=\u003e\"1632\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"369\", :free_mem=\u003e\"1632\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"369\", :free_mem=\u003e\"1632\"}\nafter terminate all processes: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"311\", :free_mem=\u003e\"1690\"}\n\nruby 2.3.0dev (2015-08-16 trunk 51564) [x86_64-linux]\ncreated 4194304 objects, consumed: 160 MB\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"312\", :free_mem=\u003e\"1689\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"313\", :free_mem=\u003e\"1688\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"312\", :free_mem=\u003e\"1689\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"315\", :free_mem=\u003e\"1685\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"315\", :free_mem=\u003e\"1686\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"317\", :free_mem=\u003e\"1684\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"317\", :free_mem=\u003e\"1684\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"318\", :free_mem=\u003e\"1683\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"319\", :free_mem=\u003e\"1682\"}\nbefore gc: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"319\", :free_mem=\u003e\"1682\"}\n...\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"361\", :free_mem=\u003e\"1640\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"361\", :free_mem=\u003e\"1640\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"361\", :free_mem=\u003e\"1640\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"361\", :free_mem=\u003e\"1640\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"362\", :free_mem=\u003e\"1639\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"362\", :free_mem=\u003e\"1639\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"362\", :free_mem=\u003e\"1639\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"362\", :free_mem=\u003e\"1639\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"362\", :free_mem=\u003e\"1639\"}\nafter gc : {:total_mem=\u003e\"2001\", :used_mem=\u003e\"362\", :free_mem=\u003e\"1639\"}\nafter terminate all processes: {:total_mem=\u003e\"2001\", :used_mem=\u003e\"310\", :free_mem=\u003e\"1691\"}\n```\n\nYou can see the improvement after GCs on MRI 2.2 and MRI 2.3-dev.\n\n## Contributing\n\n1. Fork it ( https://github.com/ko1/nakayoshi_fork/fork )\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create a new Pull Request\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fko1%2Fnakayoshi_fork","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fko1%2Fnakayoshi_fork","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fko1%2Fnakayoshi_fork/lists"}