Memory leaky ve standardní knihovně Ruby?

Posted by Jan Kubr Wed, 19 Dec 2007 13:05:00 GMT

Při hledání memory leaku v mém programu jsem narazil na to, že leakuje dost pravděpodobně stadardní knihovna Ruby. Pro detekci objektů, které zůstavají v paměti, jsem použil memory leak detektor dike.

[Update: Leaky způsobovala chyba v diku! Více na mém blogu zde.]

require 'rubygems'
require 'dike'
Dike.logfactory './log/'

class Leak

 def http_call
    puts 'making http call'
    url = URI.parse('http://www.google.com')
    Net::HTTP.start(url.host) do |http|
        puts http.get('/').code
    end
    ''
 end
end

5.times {
    leak = Leak.new
    leak.http_call
    GC.start
    Dike.finger
}

V tomto případě leakuje metoda get, zanechává Net::HTTPFound (HTTPResponse) objekty v paměti. Zaměnění get za request_get leak odstraní.

require 'rubygems'
require 'dike'
Dike.logfactory './log/'

class Leak

  def http_call
    url = URI.parse('http://www.google.com')
    puts 'making the call'
    Net::HTTP.start(url.host) {|http|
        http.request_get('/') do |response|
            response.read_body do |segment|
            end
        end
    }
    return ''
  end
end

5.times {
    leak = Leak.new
    leak.http_call
    GC.start
    Dike.finger
}

V tomto příkladě metoda read_body zanechává v paměti ReadAdapter objekty a kvůli nim tam pak zůstanou i další. Tento problém nastává pouze v případě, že se metodě předá blok. Jinak se ReadAdapter objekt nevytváří a žádný memory leak nenastává.

Nevidím na první, druhý, ani třetí pohled v uvedených příkladech nic podezřelého. Ve zdrojácích knihovny mě také do očí nic nepraštilo. Nic zajímavého jsem ani nevygooglil. Někdo je schopen mi tuhle věc objasnit (co, Davide?:). Další zastávkou bude Ruby mailing list.

Btw,

ruby leak.rb && dike log

2 comments |

Videa z RubyConf 2007

Posted by Jan Kubr Fri, 07 Dec 2007 18:48:00 GMT

Na stránkách Confreaks se již objevila videa z RubyConf 2007, alespoň tedy většina z nich. Doporučuji především přednášku Jima Weiricha o třech zajímavých Ruby-pokročilých technikách, prezentaci Rubinia Evana Phoenixe, povídání o efektivitě a síle správných nástrojů od Phil Hagelberga a Erica Hodela a v neposlední řadě keynote Matze Matsumota.

Pro mě osobně nejlepší přednáška konference - totiž ta od Ryana Davise - pořád ještě chybí, ale snad již brzy..

no comments |

Tečky v URL

Posted by Jan Kubr Thu, 06 Dec 2007 11:11:00 GMT

Měl jsem problém s tím, že "novější" Railsy interpretují tečku v URL jako oddělovač významné části URL a specifikátor požadovaného formátu odpovědi (tj. ".xml" na konci URL by bylo interpretováno jako požadavek na vrácení dat v XML formátu).

Pokud ale vaše URL obsahují tečky bez ohledu na formát, nebude vám mapování fungovat dobře. Tj. /attachment/:file nezachytí /attachment/file.txt. Řešení je ale snadné a to zeslabit omezeni na proměnnou file, aby akceptoval všechny znaky:

 /attachment/:file/, :requirements => { :file => /.*/ }

Tohle jsou víc jak rok staré zprávy a řešení se dají poměrně slušně najít, ale třeba jsem vám právě ušetřil půlhodinku bádání (+ se hodí lidem, kteří googlují v češtině).

no comments |