我们正在运行一个在Tomcat上运行的Rails上写的JRuby的小型Web应用程序.我们正在使用与另一个生产Web应用程序共享的Spring后端.不幸的是,我们一直遇到PermGen问题.
操作系统:Ubuntu Linux 2.6.24-24-server#1 SMP x86_64 GNU/Linux Java:1.6.0_21 Tomcat:6.0.28 JRuby:1.5.0 Rails:2.3.7
我们目前正在被谷歌,雅虎和百度抓获,因此网站使用率上升.我一直在使用JConsole监视Tomcat,我们肯定会看到有太多类的问题.当tomcat启动时,我们加载了大约12,000个类.8小时后,我们加载了近75,000个班级.PermGen同时从100MB增加到460MB.
类卸载工作正常,但它只在同一个8小时内卸载了~500个类.PermGen似乎永远不会被收集.
我们正在运行Tomcat的以下VM选项:
-Xms2048m -Xmx2048m -XX:MaxPermSize=512m -XX:PermSize=128m \
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=4 \
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
Run Code Online (Sandbox Code Playgroud)
显然存在某种泄漏.问题是在哪里?关于如何追踪谁以及对此负责的任何建议?我希望这是我们的一些非常愚蠢的错误,但我不知道从哪里开始.
任何建议将不胜感激.
编辑
看起来我们正在看到为每个传入请求创建一个新类.
编辑2
这肯定与JRuby有关.使用JConsole,我为类加载器启用了详细模式.以下是来自catalina.out的示例:
[Loaded anon_class1275113147_895127379 from file:/opt/apache-tomcat-6.0.28/webapps/notes/WEB-INF/lib/jruby-core-1.5.0.jar]
[Loaded anon_class1354333392_895127376 from file:/opt/apache-tomcat-6.0.28/webapps/notes/WEB-INF/lib/jruby-core-1.5.0.jar]
[Loaded anon_class1402528430_895127373 from file:/opt/apache-tomcat-6.0.28/webapps/notes/WEB-INF/lib/jruby-core-1.5.0.jar]
Run Code Online (Sandbox Code Playgroud)
那么问题就变成了如何追踪负责创建这些额外课程的一方?
编辑3
不确定这是否是问题所在,但不知何故,我们最终会遇到疯狂的类加载器.跑jmap -permstat PID了但得到了:
class_loader classes bytes parent_loader alive? type
total = 1320 135748 947431296 N/A alive=1, dead=1319 N/A
Run Code Online (Sandbox Code Playgroud)
这看起来有点过分了.大多数有三种类型的类加载器的一个:sun.reflect.DelegatingClassLoader,org.jruby.util.JRubyClassLoader或org.jruby.util.ClassCache$OneShotClassLoader.再次,样本输出来自jmap -permstat:
class_loader classes bytes parent_loader alive? …Run Code Online (Sandbox Code Playgroud) 我和我的团队正致力于在Red Hat Enterprise Linux上开发JRuby on Rails应用程序.我们的客户可能会要求我们转换为在Windows上运行它,因此我开始使用Windows 7 x64机器进行一些初步寻路.
我得到了jruby -S rake db:drop,db:create和db:migrate任务才能正常工作.但是,我一直无法让rake db:seed工作,因为我们使用Sunspot并且需要在db:seed正常工作之前运行它.当我尝试运行rake sunspot:solr:run --trace时,我得到以下输出:
** Invoke sunspot:solr:run (first_time)
** Invoke environment (first_time)
** Execute environment
Using dev environment: development
** Execute sunspot:solr:run
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing)
Unable to access jarfile start.jar
Run Code Online (Sandbox Code Playgroud)
我的猜测是,这与类路径问题有关,或者与这些问题有关,但我已经能够弄清楚到底出了什么问题.我已经尝试了将一些类路径参数传递给JRuby以及修改application.rb中的类路径,但尚未提出任何可行的解决方案.
我希望有些人可能有答案或一些想法.谢谢!
在Ubuntu上安装JRuby 1.6.7和Rails 3的博客或教程?
我想我发现了一个有关扭矩盒的错误.出于某种原因,如果我"宝石安装扭矩盒"然后在我的Gemfile中添加"宝石'扭矩盒'"线,"torquebox env"就会停止正常工作.这很容易重现,所以如果有人知道发生了什么,请告诉我:
要重现该错误,让我们创建一个新的gemset并安装torquebox-server
$ rvm use jruby-1.6.7.2
$ rvm gemset create test
$ mkdir torquetest
$ cd torquetest
$ rvm use jruby-1.6.7.2@test
Run Code Online (Sandbox Code Playgroud)
让我暂停一下,告诉你我的jruby-1.6.7.2@global中的内容,如果重要的话:
$ ls ~/.rvm/gems/jruby-1.6.7.2@global/gems
total 0
drwxr-xr-x 9 jstokes 306 Aug 9 16:26 ./
drwxr-xr-x 7 jstokes 238 Aug 9 16:25 ../
drwxr-xr-x 5 jstokes 170 Aug 9 16:25 bouncy-castle-java-1.5.0146.1/
drwxr-xr-x 15 jstokes 510 Aug 9 16:26 bundler-1.1.5/
drwxr-xr-x 34 jstokes 1156 Aug 9 16:25 jruby-launcher-1.0.15-java/
drwxr-xr-x 10 jstokes 340 Aug 9 16:25 jruby-openssl-0.7.7/
drwxr-xr-x 13 jstokes 442 …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一种功能,其中一旦设置了属性,就无法在ActiveRecord模型上更改.为此,我写了以下方法:
def address
self[:address]
end
def address=(val)
if new_record?
self[:address] = val
else
errors.add(:address, "Cannot change address, once it is set")
return false # tried return nil here first, did not work
end
end
Run Code Online (Sandbox Code Playgroud)
我在这里做错了吗?一旦我尝试更改地址,我希望该对象无效,但我没有遇到任何错误obj.valid?
编辑:一旦设置值,该值不会更改,但是当我通过obj.valid进行验证时,我想获得无效对象?
我试图将SQLite数据库用于我的jruby项目.
当我试图安装sqlite3 gem时收到以下错误
C:\tibbr\main\community_manager>gem install sqlite3-ruby
Run Code Online (Sandbox Code Playgroud)
构建原生扩展.这可能需要一段时间...错误:安装sqlite3-ruby时出错:错误:无法构建gem本机扩展.
C:/tibbr/main/tools/jruby/bin/jruby.exe extconf.rb警告:JRuby不支持本机扩展,也不支持main:Object的Dir_config(NoMethodError)mkmf' library.
Check http://kenai.com/projects/jruby/pages/Home for alternatives.
extconf.rb:10: undefined method
Gem文件将保留在C:/tibbr/main/tools/jruby/lib/ruby/gems/1.8/gems/sqlite3-1.3.4中进行检查.结果记录到C:/tibbr/main/tools/jruby/lib/ruby/gems/1.8/gems/sqlite3-1.3.4/ext/sqlite3/gem_make.out
有什么建议?提前致谢
我有一个rails应用程序,还有代码lib.我有spec目录RAILS_ROOT.
我应该如何进行测试spec?
目前,我在考虑以下问题:
spec/lib
spec/controllers
spec/models
此外,我在许多测试中做了一些常见的设置/使用常用步骤(例如,生成无效用户).你在哪里推荐我在我的rspec测试中放置执行常用设置/步骤的模块?
我在我的模型中有验证方法
def validate
super
if some condition
errors.add('', 'some text')
end
end
Run Code Online (Sandbox Code Playgroud)
此方法调用Create和Update.我不想打电话给Update.我怎样才能做到这一点?
我正在使用rails2.3.11和jruby.
更新:我可以使用这个validate :custom_validation, :on => :create,但他们如何调用创建和更新?
我也检查了一下validate_on_create,但是当我打电话的时候我仍然没有想到validate?
我安装了jruby
rvm install jruby-1.7.0
Run Code Online (Sandbox Code Playgroud)
当它试图创建gemsets时内存不足所以我开始尝试使用新版本安装bundler这就是我得到的
~>gem install bundler
Error: Your application used more stack memory than the safety cap of 2048K.
Specify -J-Xss####k to increase it (#### = cap size in KB).
Specify -w for full StackOverflowError stack trace
Run Code Online (Sandbox Code Playgroud)
所以我向上移动了内存,我仍然没有任何大量的内存
~>JRUBY_OPTS=-J-Xss1024m gem install bundler
Error: Your application used more stack memory than the safety cap of 1024M.
Specify -J-Xss####k to increase it (#### = cap size in KB).
Specify -w for full StackOverflowError stack trace
Run Code Online (Sandbox Code Playgroud)
怎么可能这还不够我运行应用程序不到那个
jrubyonrails ×10
jruby ×6
activerecord ×1
jar ×1
memory-leaks ×1
permgen ×1
rspec ×1
rspec2 ×1
ruby ×1
rubygems ×1
sqlite3-ruby ×1
tomcat ×1
torquebox ×1
unit-testing ×1
windows ×1