Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 ActiveRecord内存泄漏?我如何防止这种情况?_Ruby On Rails 3_Activerecord_Memory Leaks_Pagination - Fatal编程技术网

Ruby on rails 3 ActiveRecord内存泄漏?我如何防止这种情况?

Ruby on rails 3 ActiveRecord内存泄漏?我如何防止这种情况?,ruby-on-rails-3,activerecord,memory-leaks,pagination,Ruby On Rails 3,Activerecord,Memory Leaks,Pagination,我正在尝试构建一个页面,根据用户个人资料的浏览量对用户进行排名。由于该页面可能会获得大量点击,我缓存有序用户,并在每次概要文件获得视图时使该缓存失效。我的应用程序每天只有9个用户和200次页面浏览,超过了Heroku 512mb的内存上限。New Relic证实了这一点,向我展示了用户列表花费了过多的时间: Slowest Components Duration % ----------------------------------------------- U

我正在尝试构建一个页面,根据用户个人资料的浏览量对用户进行排名。由于该页面可能会获得大量点击,我缓存有序用户,并在每次概要文件获得视图时使该缓存失效。我的应用程序每天只有9个用户和200次页面浏览,超过了Heroku 512mb的内存上限。New Relic证实了这一点,向我展示了用户列表花费了过多的时间:

Slowest Components          Duration        %
-----------------------------------------------
UsersController#index       2,125 ms        80%
users/index.html.erb        506 ms          19%
Memcache get                20 ms           1%
User#find                   18 ms           1%
layouts/_header.html.erb    1 ms            0%
User#find_by_sql            0 ms            0%
告诉我ActiveRecord显然不会在请求后将内存交回操作系统。查看UsersControllerindex,我可以看出如果未释放User.order分配的内存,这可能会导致问题

UserControllerindex:

但我不知道我该怎么解决这个问题。我曾考虑过一次只能将一页用户拉入内存,但如果只有9个用户,这不会真正改变任何事情,因为每页最多应该列出20个用户。我是否必须在每次请求后手动从内存中清除@users,或者我在UsersControllerindex中的方法是错误的


任何帮助都将不胜感激。

不是ActiveRecord没有向操作系统释放内存,而是Ruby没有向操作系统释放内存。但是大多数程序/分配器都没有。。然而,这通常不被认为是内存泄漏。Ruby作为一个GC环境,将在对象不再具有强可访问性之后的某个时刻回收对象的内部内存。除非进程内存使用量无限增长..记住变量!=所以如果我理解正确的话,所有实例变量占用的内存应该在请求后由ruby自动回收?我的应用程序使用的内存仍然在线性增长,虽然从100mb增加到300mb。将@users存储在缓存中会不会以某种方式阻止Ruby将其取消分配?请注意,使用Rails.cache.fetchVariables不是对象。变量可以保持对对象的强引用;如果存在对具有该变量的对象的强引用,依此类推,直到有根,那么该变量引用的对象是强可访问的。因此,如果用户中对所述对象的唯一强引用是,users,那么当用户作为实例变量的对象不再是强可访问的时,扩展而言,用户中的对象不再是强可访问的。这听起来比实际情况更复杂。。
require 'will_paginate/array'

class UsersController < ApplicationController
  PER_PAGE = 20

  def index
    @users = Rails.cache.read("users")
    if @users.nil?
      # .all is used to force the query to happen now, so that the result set is cached instead of the query
      @users = User.order("views DESC").all
      Rails.cache.write("users", @users)
    end

    @users = @users.paginate(page: params[:page], per_page: PER_PAGE)

    if params[:page].nil? || params[:page] == "1"
      @rank = 1
    else
      @title = "Page #{params[:page]}"
      @rank = (params[:page].to_i - 1) * PER_PAGE + 1
    end
  end
end
<% @users.each do |user| %>
  image_tag user.profile_picture, alt: user.name
  <h3><%= @rank %></h3>
  <p><%= user.name %></p>
  <p><%= user.views %></p>
  <% @rank += 1 %>
<% end %>
<%= will_paginate %>