对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
相关文档:
Ruport中pdf_writer对中文的支持并不好,输出的中文显示的是乱码。上网查了很多资料,也没有找到好的解决方案,无奈只好查看源代码,到底为什么Ruport自带的PDF工具不支持中文输出。
Ruport::Formatter::PDF::Writer中找到以下代码
metrics = load_font_metrics(font)
metrics = PDF::Writer: ......
转自51testing.com, 原见:http://bbs.51testing.com/thread-171535-1-1.html http://swik.net/Watir+Programming
http://www.pragprog.com/ #很多好的源码哦
http://docs.rubygems.org/ #rubygems
http://www.fxruby.org/ #fxruby
http://groups.google.com/group/watir-general/topics #goog ......
此例子在 Ruby Ruport实践—简单报表系统 及 Ruby Ruport实践—中文PDF报表之PRAWN 的基础上进行完善,添加了对报表参数的设计及实现。
一、创建数据表report_parameters
create table report_parameters
(report_parameter_id integer not null auto_increment,
report_execute_id integer not null, ......