非常简单的一个脚本,运行两次看结果
require 'json'
class Numeric
def to_hmsize
if self > 1024 * 1024
"#{(self * 1.0 / (1024 * 1024)).round(2)} MB"
end
end
def to_hmtime
min = self % 3600 / 60
sec = self % 60
str = ""
str = "#{min}m" if min > 0
str = "#{str}#{sec}s" if sec > 0
str
end
end
file = File.expand_path("../wiki_pages.json", __FILE__)
if !File.exists?(file)
open(file, 'w') do |f|
array = []
700000.times.each do |i|
array << {pageid: i, title: "title of #{i}", pagename: "pagename_of_#{i}"}
end
f.puts array.to_json
end
puts "created a json file: #{File.size(file)}[#{File.size(file).to_hmsize}]"
puts "init the json file at the first launch, please run again."
exit
end
puts RUBY_DESCRIPTION
require 'objspace'
Thread.new do
started = Time.now.to_i
while true
sys_mem = (`ps -o rss= -p #{Process.pid}`.strip.to_i * 1024).to_hmsize
objspace_mem = ObjectSpace.memsize_of_all.to_hmsize
puts "#{(Time.now.to_i - started).to_hmtime}\tsys_mem:#{sys_mem}, objspace_mem:#{objspace_mem}"
sleep 3
GC.start
end
end
sleep 10
puts "read content from file #{File.size(file)}[#{File.size(file).to_hmsize}]"
json = IO.read(file)
sleep 30
puts "parse json string to object"
obj = JSON.parse(json)
sleep 30
puts "set string&object to nil, and sleep 30 min to check the memory usage."
json = nil
obj = nil
sleep 1800
我测试出来的结果是,在 Mac 上,进程的内存占用以 12M 开始,峰值 400M,30 分钟后退出时 45M 左右。但是在 CentOS 上,垃圾回收到 280M 就不会再下降了。
Ruby 版本 2.5.1 和 2.5.3 的结果一样,Ruby 是用 rvm 安装的。
准备给开发组报 bug 了,谁有空先帮忙验证一下。