易截截图软件、单文件、免安装、纯绿色、仅160KB

对Ruby VM的GC的思考

Ruby虽然是动态脚本语言,但是和Java一样,带有VM,有自己的内存堆,创建对象的时候在堆里面分配内存,对象使用完毕由GC进行回收。但是通过我们运营Rails网站两年多的实践来看,Ruby VM的GC还是存在很大的问题。简单的来说,就是GC之后,尽管对象已经完全回收,但是物理内存释放不够充分,有泄漏的现象。通过pmap来dump ruby进程物理内存地址映射表进行分析,观察到ruby的内存堆总是在不停的扩张,GC之后回收不干净。而我对比观察Java VM,其Full GC之后,物理内存释放的非常干净。所以用Ruby做服务器长期的跑,就会发现Ruby进程没有理由的缓慢泄漏内存,内存堆缓慢增长,貌似没有上限。
由于pmap命令可以dump进程的内存映射表,因此我们可以对比RubyVM和JVM在GC前后的内存映射情况。比方说Ruby的内存状况大概是这样的:
下图是一个Ruby进程的物理内存映射表,堆内存占据的空间是我抽取出来的三行:
Ruby代码
00000000005d4000 125260K rwx--    [ anon ]   
0000002a95c23000  23456K rw---    [ anon ]   
0000002a99186000  50980K rw---    [ anon ]  
00000000005d4000 125260K rwx-- [ anon ]
0000002a95c23000 23456K rw--- [ anon ]
0000002a99186000 50980K rw--- [ anon ]
Ruby代码
0000000000400000    760K r-x--  /usr/local/ruby/bin/ruby   
00000000005bd000     92K rw---  /usr/local/ruby/bin/ruby   
00000000005d4000 125260K rwx--    [ anon ]   
0000002a95556000     84K r-x--  /lib64/ld-2.3.3.so   
0000002a9556b000     12K rw---    [ anon ]   
0000002a9556e000     24K r--s-  /usr/lib64/gconv/gconv-modules.cache   
0000002a95574000      4K rw---    [ anon ]   
0000002a95577000


相关文档:

Ruby中%的用法(百分号的用法)

%{String}  用于创建一个使用双引号括起来的字符串 
%Q{String} 用于创建一个使用双引号括起来的字符串 
%Q!Some String of “Characters”! <==> ” Some String of \”Characters\” “
%q{String} 用于创建一个使用单引号括起来的字符串 
%q!Som ......

ruby 字符串 理解 "" ''

ruby中单引号和双引号的意义有所不同,双引号包围的字符作变量替换,单引号包围的变量不做替换
也可以使用 %q 和 %Q 来生成字符串对象。%q 相当于单引号,%Q相当于双引号。
举例如下:
irb(main):010:0> "show trsult: #{1*3}"
=> "show trsult: 3"
irb(main):011:0> 'show trsult: #{1*3}'
=> "show trs ......

Ruby异常处理

Ruby 异常处理
文章分类:Ruby编程 关键字: ruby 异常 异常处理
       异常处理是开发过程中经常要面对的问题,基本所有高级语言都有自己的异常处理系统,ruby也不例外,而且使用起来也非常简单。
        ruby中异常的抛出是使用的raise方法,记住 ......

Ruby Ruport实践—Ruport::Formatter应用扩展

Ruport目前自带支持PDF,HTML,CSV,TXT格式输出,如果想打印.xml,.bat报表怎么办?
本例将以XML格式为例,实现Ruport::Formatter的另一种自定义应用。
Ruport的应用参考: Ruby Ruport实践—简单报表系统
注:其他格式的报表只需要修改renders对应的内容(如希望保存为.bat格式,将renders :xml改为renders :bat), ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号