标签: jrubyonrails

在Tomcat中跟踪JRuby on Rails的PermGen问题

我们正在运行一个在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.JRubyClassLoaderorg.jruby.util.ClassCache$OneShotClassLoader.再次,样本输出来自jmap -permstat:

class_loader            classes bytes      parent_loader           alive? …
Run Code Online (Sandbox Code Playgroud)

tomcat memory-leaks jruby jrubyonrails permgen

5
推荐指数
1
解决办法
3353
查看次数

尝试在Windows 7 x64上使用JRuby on Rails时使用sunspot solr时无法访问jarfile start.jar

我和我的团队正致力于在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中的类路径,但尚未提出任何可行的解决方案.

我希望有些人可能有答案或一些想法.谢谢!

windows jrubyonrails

4
推荐指数
1
解决办法
1950
查看次数

用Ubuntu安装JRuby 1.6.7 + Rails 3?

在Ubuntu上安装JRuby 1.6.7和Rails 3的博客或教程?

jruby jrubyonrails

4
推荐指数
1
解决办法
3089
查看次数

Gemfile导致扭矩盒env变量变空

我想我发现了一个有关扭矩盒的错误.出于某种原因,如果我"宝石安装扭矩盒"然后在我的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)

ruby-on-rails jruby jrubyonrails torquebox

4
推荐指数
1
解决办法
691
查看次数

将jruby on rails应用程序编译到jar中?

有没有一种快速方法将一个jruby on rails应用程序打包到一个罐子里?

在轨道应用程序上的jruby虚拟设备是否有ec2

jar jruby jrubyonrails executable-jar

3
推荐指数
1
解决办法
1284
查看次数

在ActiveRecord中标记无效属性

我正在尝试实现一种功能,其中一旦设置了属性,就无法在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进行验证时,我想获得无效对象?

activerecord jrubyonrails ruby-on-rails-3

3
推荐指数
1
解决办法
2478
查看次数

SQLite db for jruby的问题

我试图将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

有什么建议?提前致谢

rubygems jrubyonrails sqlite3-ruby

3
推荐指数
1
解决办法
1086
查看次数

推荐构建rspec模块的方法?

我有一个rails应用程序,还有代码lib.我有spec目录RAILS_ROOT.

我应该如何进行测试spec

目前,我在考虑以下问题:

spec/lib

spec/controllers

spec/models

此外,我在许多测试中做了一些常见的设置/使用常用步骤(例如,生成无效用户).你在哪里推荐我在我的rspec测试中放置执行常用设置/步骤的模块?

unit-testing rspec jrubyonrails rspec2

2
推荐指数
1
解决办法
1690
查看次数

验证方法调用仅适用于创建,而不适用于更新

我在我的模型中有验证方法

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

ruby ruby-on-rails jruby jrubyonrails ruby-on-rails-2

2
推荐指数
1
解决办法
3050
查看次数

JRuby 1.7.0不会在内存充足的情况下安装捆绑器

我安装了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)

怎么可能这还不够我运行应用程序不到那个

jruby jrubyonrails

2
推荐指数
1
解决办法
1398
查看次数